mirror of https://github.com/PCSX2/pcsx2.git
Debugger: Visually show what CPU triggered a breakpoint
This commit is contained in:
parent
95d1dcc521
commit
be405eb705
|
@ -48,7 +48,7 @@ DebuggerWindow::DebuggerWindow(QWidget* parent)
|
||||||
connect(g_emu_thread, &EmuThread::onVMResumed, this, &DebuggerWindow::onVMStateChanged);
|
connect(g_emu_thread, &EmuThread::onVMResumed, this, &DebuggerWindow::onVMStateChanged);
|
||||||
|
|
||||||
onVMStateChanged(); // If we missed a state change while we weren't loaded
|
onVMStateChanged(); // If we missed a state change while we weren't loaded
|
||||||
|
|
||||||
// We can't do this in the designer, but we want to right align the actionOnTop action in the toolbar
|
// We can't do this in the designer, but we want to right align the actionOnTop action in the toolbar
|
||||||
QWidget* spacer = new QWidget(this);
|
QWidget* spacer = new QWidget(this);
|
||||||
spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
||||||
|
@ -67,6 +67,14 @@ DebuggerWindow::DebuggerWindow(QWidget* parent)
|
||||||
|
|
||||||
DebuggerWindow::~DebuggerWindow() = default;
|
DebuggerWindow::~DebuggerWindow() = default;
|
||||||
|
|
||||||
|
// There is no straightforward way to set the tab text to bold in Qt
|
||||||
|
// Sorry colour blind people, but this is the best we can do for now
|
||||||
|
void DebuggerWindow::setTabActiveStyle(BreakPointCpu enabledCpu)
|
||||||
|
{
|
||||||
|
m_ui.cpuTabs->tabBar()->setTabTextColor(m_ui.cpuTabs->indexOf(m_cpuWidget_r5900), (enabledCpu == BREAKPOINT_EE) ? Qt::red : this->palette().text().color());
|
||||||
|
m_ui.cpuTabs->tabBar()->setTabTextColor(m_ui.cpuTabs->indexOf(m_cpuWidget_r3000), (enabledCpu == BREAKPOINT_IOP) ? Qt::red : this->palette().text().color());
|
||||||
|
}
|
||||||
|
|
||||||
void DebuggerWindow::onVMStateChanged()
|
void DebuggerWindow::onVMStateChanged()
|
||||||
{
|
{
|
||||||
if (!QtHost::IsVMPaused())
|
if (!QtHost::IsVMPaused())
|
||||||
|
@ -76,6 +84,7 @@ void DebuggerWindow::onVMStateChanged()
|
||||||
m_ui.actionStepInto->setEnabled(false);
|
m_ui.actionStepInto->setEnabled(false);
|
||||||
m_ui.actionStepOver->setEnabled(false);
|
m_ui.actionStepOver->setEnabled(false);
|
||||||
m_ui.actionStepOut->setEnabled(false);
|
m_ui.actionStepOut->setEnabled(false);
|
||||||
|
setTabActiveStyle(BREAKPOINT_IOP_AND_EE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -84,17 +93,32 @@ void DebuggerWindow::onVMStateChanged()
|
||||||
m_ui.actionStepInto->setEnabled(true);
|
m_ui.actionStepInto->setEnabled(true);
|
||||||
m_ui.actionStepOver->setEnabled(true);
|
m_ui.actionStepOver->setEnabled(true);
|
||||||
m_ui.actionStepOut->setEnabled(true);
|
m_ui.actionStepOut->setEnabled(true);
|
||||||
Host::RunOnCPUThread([] {
|
// Switch to the CPU tab that triggered the breakpoint
|
||||||
if (CBreakPoints::GetBreakpointTriggered())
|
// Also bold the tab text to indicate that a breakpoint was triggered
|
||||||
|
if (CBreakPoints::GetBreakpointTriggered())
|
||||||
|
{
|
||||||
|
const BreakPointCpu triggeredCpu = CBreakPoints::GetBreakpointTriggeredCpu();
|
||||||
|
setTabActiveStyle(triggeredCpu);
|
||||||
|
switch (triggeredCpu)
|
||||||
{
|
{
|
||||||
|
case BREAKPOINT_EE:
|
||||||
|
m_ui.cpuTabs->setCurrentWidget(m_cpuWidget_r5900);
|
||||||
|
break;
|
||||||
|
case BREAKPOINT_IOP:
|
||||||
|
m_ui.cpuTabs->setCurrentWidget(m_cpuWidget_r3000);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Host::RunOnCPUThread([] {
|
||||||
CBreakPoints::ClearTemporaryBreakPoints();
|
CBreakPoints::ClearTemporaryBreakPoints();
|
||||||
CBreakPoints::SetBreakpointTriggered(false);
|
CBreakPoints::SetBreakpointTriggered(false, BREAKPOINT_IOP_AND_EE);
|
||||||
// Our current PC is on a breakpoint.
|
// Our current PC is on a breakpoint.
|
||||||
// When we run the core again, we want to skip this breakpoint and run
|
// When we run the core again, we want to skip this breakpoint and run
|
||||||
CBreakPoints::SetSkipFirst(BREAKPOINT_EE, r5900Debug.getPC());
|
CBreakPoints::SetSkipFirst(BREAKPOINT_EE, r5900Debug.getPC());
|
||||||
CBreakPoints::SetSkipFirst(BREAKPOINT_IOP, r3000Debug.getPC());
|
CBreakPoints::SetSkipFirst(BREAKPOINT_IOP, r3000Debug.getPC());
|
||||||
}
|
});
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,4 +44,6 @@ private:
|
||||||
|
|
||||||
CpuWidget* m_cpuWidget_r5900;
|
CpuWidget* m_cpuWidget_r5900;
|
||||||
CpuWidget* m_cpuWidget_r3000;
|
CpuWidget* m_cpuWidget_r3000;
|
||||||
};
|
|
||||||
|
void setTabActiveStyle(BreakPointCpu toggledCPU);
|
||||||
|
};
|
||||||
|
|
|
@ -30,6 +30,7 @@ u64 CBreakPoints::breakSkipFirstTicksIop_ = 0;
|
||||||
std::vector<MemCheck> CBreakPoints::memChecks_;
|
std::vector<MemCheck> CBreakPoints::memChecks_;
|
||||||
std::vector<MemCheck*> CBreakPoints::cleanupMemChecks_;
|
std::vector<MemCheck*> CBreakPoints::cleanupMemChecks_;
|
||||||
bool CBreakPoints::breakpointTriggered_ = false;
|
bool CBreakPoints::breakpointTriggered_ = false;
|
||||||
|
BreakPointCpu CBreakPoints::breakpointTriggeredCpu_;
|
||||||
bool CBreakPoints::corePaused = false;
|
bool CBreakPoints::corePaused = false;
|
||||||
std::function<void()> CBreakPoints::cb_bpUpdated_;
|
std::function<void()> CBreakPoints::cb_bpUpdated_;
|
||||||
|
|
||||||
|
|
|
@ -153,8 +153,9 @@ public:
|
||||||
|
|
||||||
static void Update(BreakPointCpu cpu = BREAKPOINT_IOP_AND_EE, u32 addr = 0);
|
static void Update(BreakPointCpu cpu = BREAKPOINT_IOP_AND_EE, u32 addr = 0);
|
||||||
|
|
||||||
static void SetBreakpointTriggered(bool b) { breakpointTriggered_ = b; };
|
static void SetBreakpointTriggered(bool triggered, BreakPointCpu cpu = BreakPointCpu::BREAKPOINT_IOP_AND_EE) { breakpointTriggered_ = triggered; breakpointTriggeredCpu_ = cpu; };
|
||||||
static bool GetBreakpointTriggered() { return breakpointTriggered_; };
|
static bool GetBreakpointTriggered() { return breakpointTriggered_; };
|
||||||
|
static BreakPointCpu GetBreakpointTriggeredCpu() { return breakpointTriggeredCpu_; };
|
||||||
|
|
||||||
static bool GetCorePaused() { return corePaused; };
|
static bool GetCorePaused() { return corePaused; };
|
||||||
static void SetCorePaused(bool b) { corePaused = b; };
|
static void SetCorePaused(bool b) { corePaused = b; };
|
||||||
|
@ -175,6 +176,7 @@ private:
|
||||||
static u64 breakSkipFirstTicksIop_;
|
static u64 breakSkipFirstTicksIop_;
|
||||||
|
|
||||||
static bool breakpointTriggered_;
|
static bool breakpointTriggered_;
|
||||||
|
static BreakPointCpu breakpointTriggeredCpu_;
|
||||||
static bool corePaused;
|
static bool corePaused;
|
||||||
|
|
||||||
static std::function<void()> cb_bpUpdated_;
|
static std::function<void()> cb_bpUpdated_;
|
||||||
|
|
|
@ -54,7 +54,7 @@ void intBreakpoint(bool memcheck)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
CBreakPoints::SetBreakpointTriggered(true);
|
CBreakPoints::SetBreakpointTriggered(true, BREAKPOINT_EE);
|
||||||
VMManager::SetPaused(true);
|
VMManager::SetPaused(true);
|
||||||
Cpu->ExitExecution();
|
Cpu->ExitExecution();
|
||||||
}
|
}
|
||||||
|
|
|
@ -143,7 +143,7 @@ void psxBreakpoint(bool memcheck)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
CBreakPoints::SetBreakpointTriggered(true);
|
CBreakPoints::SetBreakpointTriggered(true, BREAKPOINT_IOP);
|
||||||
VMManager::SetPaused(true);
|
VMManager::SetPaused(true);
|
||||||
Cpu->ExitExecution();
|
Cpu->ExitExecution();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1289,7 +1289,7 @@ static bool psxDynarecCheckBreakpoint()
|
||||||
if (!hit)
|
if (!hit)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
CBreakPoints::SetBreakpointTriggered(true);
|
CBreakPoints::SetBreakpointTriggered(true, BREAKPOINT_IOP);
|
||||||
VMManager::SetPaused(true);
|
VMManager::SetPaused(true);
|
||||||
|
|
||||||
// Exit the EE too.
|
// Exit the EE too.
|
||||||
|
@ -1303,7 +1303,7 @@ static bool psxDynarecMemcheck()
|
||||||
if (CBreakPoints::CheckSkipFirst(BREAKPOINT_IOP, pc) == pc)
|
if (CBreakPoints::CheckSkipFirst(BREAKPOINT_IOP, pc) == pc)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
CBreakPoints::SetBreakpointTriggered(true);
|
CBreakPoints::SetBreakpointTriggered(true, BREAKPOINT_IOP);
|
||||||
VMManager::SetPaused(true);
|
VMManager::SetPaused(true);
|
||||||
|
|
||||||
// Exit the EE too.
|
// Exit the EE too.
|
||||||
|
|
|
@ -1537,7 +1537,7 @@ void dynarecCheckBreakpoint()
|
||||||
if (!hit)
|
if (!hit)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
CBreakPoints::SetBreakpointTriggered(true);
|
CBreakPoints::SetBreakpointTriggered(true, BREAKPOINT_EE);
|
||||||
VMManager::SetPaused(true);
|
VMManager::SetPaused(true);
|
||||||
recExitExecution();
|
recExitExecution();
|
||||||
}
|
}
|
||||||
|
@ -1548,7 +1548,7 @@ void dynarecMemcheck()
|
||||||
if (CBreakPoints::CheckSkipFirst(BREAKPOINT_EE, pc) != 0)
|
if (CBreakPoints::CheckSkipFirst(BREAKPOINT_EE, pc) != 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
CBreakPoints::SetBreakpointTriggered(true);
|
CBreakPoints::SetBreakpointTriggered(true, BREAKPOINT_EE);
|
||||||
VMManager::SetPaused(true);
|
VMManager::SetPaused(true);
|
||||||
recExitExecution();
|
recExitExecution();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue