[Debugger] Make skip a setting
This commit is contained in:
parent
8a85f1e6a4
commit
3d7e9b40b0
|
@ -27,6 +27,6 @@ __interface CDebugger
|
||||||
virtual void WaitForStep(void) = 0;
|
virtual void WaitForStep(void) = 0;
|
||||||
virtual bool ExecutionBP(uint32_t address) = 0;
|
virtual bool ExecutionBP(uint32_t address) = 0;
|
||||||
|
|
||||||
virtual bool CPUStepStarted(void) = 0;
|
virtual void CPUStepStarted(void) = 0;
|
||||||
virtual void CPUStep(void) = 0;
|
virtual void CPUStep(void) = 0;
|
||||||
};
|
};
|
||||||
|
|
|
@ -307,14 +307,20 @@ void CInterpreterCPU::ExecuteCPU()
|
||||||
if (isStepping())
|
if (isStepping())
|
||||||
{
|
{
|
||||||
g_Debugger->WaitForStep();
|
g_Debugger->WaitForStep();
|
||||||
|
|
||||||
|
if (SkipOp())
|
||||||
|
{
|
||||||
|
// Skip command if instructed by the debugger
|
||||||
|
g_Settings->SaveBool(Debugger_SkipOp, false);
|
||||||
|
PROGRAM_COUNTER += 4;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CDebugSettings::HaveDebugger() && !g_Debugger->CPUStepStarted())
|
if (CDebugSettings::HaveDebugger())
|
||||||
{
|
{
|
||||||
// Skip command if instructed by the debugger
|
g_Debugger->CPUStepStarted();
|
||||||
PROGRAM_COUNTER += 4;
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if (PROGRAM_COUNTER > 0x80000300 && PROGRAM_COUNTER < 0x80380000)
|
/* if (PROGRAM_COUNTER > 0x80000300 && PROGRAM_COUNTER < 0x80380000)
|
||||||
|
|
|
@ -15,9 +15,10 @@ int CDebugSettings::m_RefCount = 0;
|
||||||
|
|
||||||
bool CDebugSettings::m_Registered = false;
|
bool CDebugSettings::m_Registered = false;
|
||||||
|
|
||||||
bool CDebugSettings::m_HaveDebugger = true;
|
bool CDebugSettings::m_HaveDebugger = false;
|
||||||
bool CDebugSettings::m_Debugging = true;
|
bool CDebugSettings::m_Debugging = false;
|
||||||
bool CDebugSettings::m_Stepping = true;
|
bool CDebugSettings::m_Stepping = false;
|
||||||
|
bool CDebugSettings::m_SkipOp = false;
|
||||||
bool CDebugSettings::m_WaitingForStep = false;
|
bool CDebugSettings::m_WaitingForStep = false;
|
||||||
bool CDebugSettings::m_bRecordRecompilerAsm = false;
|
bool CDebugSettings::m_bRecordRecompilerAsm = false;
|
||||||
bool CDebugSettings::m_bShowTLBMisses = false;
|
bool CDebugSettings::m_bShowTLBMisses = false;
|
||||||
|
@ -37,6 +38,7 @@ CDebugSettings::CDebugSettings()
|
||||||
g_Settings->RegisterChangeCB(Debugger_ShowDivByZero, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
|
g_Settings->RegisterChangeCB(Debugger_ShowDivByZero, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
|
||||||
g_Settings->RegisterChangeCB(Debugger_RecordExecutionTimes, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
|
g_Settings->RegisterChangeCB(Debugger_RecordExecutionTimes, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
|
||||||
g_Settings->RegisterChangeCB(Debugger_SteppingOps, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
|
g_Settings->RegisterChangeCB(Debugger_SteppingOps, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
|
||||||
|
g_Settings->RegisterChangeCB(Debugger_SkipOp, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
|
||||||
g_Settings->RegisterChangeCB(Debugger_HaveExecutionBP, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
|
g_Settings->RegisterChangeCB(Debugger_HaveExecutionBP, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
|
||||||
g_Settings->RegisterChangeCB(Debugger_WaitingForStep, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
|
g_Settings->RegisterChangeCB(Debugger_WaitingForStep, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
|
||||||
|
|
||||||
|
@ -55,6 +57,7 @@ CDebugSettings::~CDebugSettings()
|
||||||
g_Settings->UnregisterChangeCB(Debugger_ShowDivByZero, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
|
g_Settings->UnregisterChangeCB(Debugger_ShowDivByZero, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
|
||||||
g_Settings->UnregisterChangeCB(Debugger_RecordExecutionTimes, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
|
g_Settings->UnregisterChangeCB(Debugger_RecordExecutionTimes, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
|
||||||
g_Settings->UnregisterChangeCB(Debugger_SteppingOps, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
|
g_Settings->UnregisterChangeCB(Debugger_SteppingOps, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
|
||||||
|
g_Settings->UnregisterChangeCB(Debugger_SkipOp, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
|
||||||
g_Settings->UnregisterChangeCB(Debugger_HaveExecutionBP, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
|
g_Settings->UnregisterChangeCB(Debugger_HaveExecutionBP, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
|
||||||
g_Settings->UnregisterChangeCB(Debugger_WaitingForStep, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
|
g_Settings->UnregisterChangeCB(Debugger_WaitingForStep, this, (CSettings::SettingChangedFunc)StaticRefreshSettings);
|
||||||
}
|
}
|
||||||
|
@ -68,6 +71,7 @@ void CDebugSettings::RefreshSettings()
|
||||||
m_bShowDivByZero = m_HaveDebugger && g_Settings->LoadBool(Debugger_ShowDivByZero);
|
m_bShowDivByZero = m_HaveDebugger && g_Settings->LoadBool(Debugger_ShowDivByZero);
|
||||||
m_RecordExecutionTimes = g_Settings->LoadBool(Debugger_RecordExecutionTimes);
|
m_RecordExecutionTimes = g_Settings->LoadBool(Debugger_RecordExecutionTimes);
|
||||||
m_Stepping = g_Settings->LoadBool(Debugger_SteppingOps);
|
m_Stepping = g_Settings->LoadBool(Debugger_SteppingOps);
|
||||||
|
m_SkipOp = g_Settings->LoadBool(Debugger_SkipOp);
|
||||||
m_WaitingForStep = g_Settings->LoadBool(Debugger_WaitingForStep);
|
m_WaitingForStep = g_Settings->LoadBool(Debugger_WaitingForStep);
|
||||||
m_HaveExecutionBP = g_Settings->LoadBool(Debugger_HaveExecutionBP);
|
m_HaveExecutionBP = g_Settings->LoadBool(Debugger_HaveExecutionBP);
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,7 @@ public:
|
||||||
static inline bool HaveDebugger(void) { return m_HaveDebugger; }
|
static inline bool HaveDebugger(void) { return m_HaveDebugger; }
|
||||||
static inline bool isDebugging(void) { return m_Debugging; }
|
static inline bool isDebugging(void) { return m_Debugging; }
|
||||||
static inline bool isStepping(void) { return m_Stepping; }
|
static inline bool isStepping(void) { return m_Stepping; }
|
||||||
|
static inline bool SkipOp(void) { return m_SkipOp; }
|
||||||
static inline bool WaitingForStep(void) { return m_WaitingForStep; }
|
static inline bool WaitingForStep(void) { return m_WaitingForStep; }
|
||||||
static inline bool bRecordRecompilerAsm(void) { return m_bRecordRecompilerAsm; }
|
static inline bool bRecordRecompilerAsm(void) { return m_bRecordRecompilerAsm; }
|
||||||
static inline bool bShowTLBMisses(void) { return m_bShowTLBMisses; }
|
static inline bool bShowTLBMisses(void) { return m_bShowTLBMisses; }
|
||||||
|
@ -39,6 +40,7 @@ private:
|
||||||
static bool m_HaveDebugger;
|
static bool m_HaveDebugger;
|
||||||
static bool m_Debugging;
|
static bool m_Debugging;
|
||||||
static bool m_Stepping;
|
static bool m_Stepping;
|
||||||
|
static bool m_SkipOp;
|
||||||
static bool m_WaitingForStep;
|
static bool m_WaitingForStep;
|
||||||
static bool m_bRecordRecompilerAsm;
|
static bool m_bRecordRecompilerAsm;
|
||||||
static bool m_bShowTLBMisses;
|
static bool m_bShowTLBMisses;
|
||||||
|
|
|
@ -230,6 +230,7 @@ enum SettingID
|
||||||
Debugger_DebugLanguage,
|
Debugger_DebugLanguage,
|
||||||
Debugger_RecordExecutionTimes,
|
Debugger_RecordExecutionTimes,
|
||||||
Debugger_SteppingOps,
|
Debugger_SteppingOps,
|
||||||
|
Debugger_SkipOp,
|
||||||
Debugger_HaveExecutionBP,
|
Debugger_HaveExecutionBP,
|
||||||
Debugger_WaitingForStep,
|
Debugger_WaitingForStep,
|
||||||
|
|
||||||
|
|
|
@ -315,6 +315,7 @@ void CSettings::AddHowToHandleSetting(const char * BaseDirectory)
|
||||||
AddHandler(Debugger_ShowRecompMemSize, new CSettingTypeApplication("Debugger", "Show Recompiler Memory size", false));
|
AddHandler(Debugger_ShowRecompMemSize, new CSettingTypeApplication("Debugger", "Show Recompiler Memory size", false));
|
||||||
AddHandler(Debugger_RecordExecutionTimes, new CSettingTypeApplication("Debugger", "Record Execution Times", false));
|
AddHandler(Debugger_RecordExecutionTimes, new CSettingTypeApplication("Debugger", "Record Execution Times", false));
|
||||||
AddHandler(Debugger_SteppingOps, new CSettingTypeTempBool(false));
|
AddHandler(Debugger_SteppingOps, new CSettingTypeTempBool(false));
|
||||||
|
AddHandler(Debugger_SkipOp, new CSettingTypeTempBool(false));
|
||||||
AddHandler(Debugger_HaveExecutionBP, new CSettingTypeTempBool(false));
|
AddHandler(Debugger_HaveExecutionBP, new CSettingTypeTempBool(false));
|
||||||
AddHandler(Debugger_WaitingForStep, new CSettingTypeTempBool(false));
|
AddHandler(Debugger_WaitingForStep, new CSettingTypeTempBool(false));
|
||||||
AddHandler(Debugger_DebugLanguage, new CSettingTypeApplication("Debugger", "Debug Language", false));
|
AddHandler(Debugger_DebugLanguage, new CSettingTypeApplication("Debugger", "Debug Language", false));
|
||||||
|
|
|
@ -19,18 +19,6 @@
|
||||||
|
|
||||||
CBreakpoints::CBreakpoints()
|
CBreakpoints::CBreakpoints()
|
||||||
{
|
{
|
||||||
m_Skipping = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CBreakpoints::isSkipping()
|
|
||||||
{
|
|
||||||
bool ret = m_Skipping;
|
|
||||||
m_Skipping = FALSE;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
void CBreakpoints::Skip()
|
|
||||||
{
|
|
||||||
m_Skipping = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CBreakpoints::RBPAdd(uint32_t address, bool bTemporary)
|
bool CBreakpoints::RBPAdd(uint32_t address, bool bTemporary)
|
||||||
|
|
|
@ -36,10 +36,6 @@ public:
|
||||||
BPSTATE WriteBPExists(uint32_t address, bool bRemoveTemp = false);
|
BPSTATE WriteBPExists(uint32_t address, bool bRemoveTemp = false);
|
||||||
BPSTATE ExecutionBPExists(uint32_t address, bool bRemoveTemp = false);
|
BPSTATE ExecutionBPExists(uint32_t address, bool bRemoveTemp = false);
|
||||||
|
|
||||||
void Skip();
|
|
||||||
|
|
||||||
bool isSkipping();
|
|
||||||
|
|
||||||
bool RBPAdd(uint32_t address, bool bTemporary = false);
|
bool RBPAdd(uint32_t address, bool bTemporary = false);
|
||||||
void RBPRemove(uint32_t address);
|
void RBPRemove(uint32_t address);
|
||||||
void RBPToggle(uint32_t address, bool bTemporary = false);
|
void RBPToggle(uint32_t address, bool bTemporary = false);
|
||||||
|
@ -61,6 +57,4 @@ private:
|
||||||
breakpoints_t m_ReadMem;
|
breakpoints_t m_ReadMem;
|
||||||
breakpoints_t m_WriteMem;
|
breakpoints_t m_WriteMem;
|
||||||
breakpoints_t m_Execution;
|
breakpoints_t m_Execution;
|
||||||
|
|
||||||
bool m_Skipping;
|
|
||||||
};
|
};
|
|
@ -1096,7 +1096,11 @@ void CDebugCommandsView::RemoveSelectedBreakpoints()
|
||||||
|
|
||||||
void CDebugCommandsView::CPUSkip()
|
void CDebugCommandsView::CPUSkip()
|
||||||
{
|
{
|
||||||
m_Breakpoints->Skip();
|
g_Settings->SaveBool(Debugger_SkipOp, true);
|
||||||
|
if (WaitingForStep())
|
||||||
|
{
|
||||||
|
m_StepEvent.Trigger();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDebugCommandsView::CPUResume()
|
void CDebugCommandsView::CPUResume()
|
||||||
|
|
|
@ -375,7 +375,7 @@ void CDebuggerUI::TLBChanged()
|
||||||
|
|
||||||
// Called from the interpreter core at the beginning of every CPU step
|
// Called from the interpreter core at the beginning of every CPU step
|
||||||
// Returns false when the instruction should be skipped
|
// Returns false when the instruction should be skipped
|
||||||
bool CDebuggerUI::CPUStepStarted()
|
void CDebuggerUI::CPUStepStarted()
|
||||||
{
|
{
|
||||||
uint32_t PROGRAM_COUNTER = g_Reg->m_PROGRAM_COUNTER;
|
uint32_t PROGRAM_COUNTER = g_Reg->m_PROGRAM_COUNTER;
|
||||||
uint32_t JumpToLocation = R4300iOp::m_JumpToLocation;
|
uint32_t JumpToLocation = R4300iOp::m_JumpToLocation;
|
||||||
|
@ -434,7 +434,7 @@ bool CDebuggerUI::CPUStepStarted()
|
||||||
|
|
||||||
if (!isStepping())
|
if (!isStepping())
|
||||||
{
|
{
|
||||||
return !m_Breakpoints->isSkipping();
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (R4300iOp::m_NextInstruction != JUMP)
|
if (R4300iOp::m_NextInstruction != JUMP)
|
||||||
|
@ -448,11 +448,10 @@ bool CDebuggerUI::CPUStepStarted()
|
||||||
goto breakpoint_hit;
|
goto breakpoint_hit;
|
||||||
}
|
}
|
||||||
|
|
||||||
return !m_Breakpoints->isSkipping();
|
return;
|
||||||
|
|
||||||
breakpoint_hit:
|
breakpoint_hit:
|
||||||
g_Settings->SaveBool(Debugger_SteppingOps, true);
|
g_Settings->SaveBool(Debugger_SteppingOps, true);
|
||||||
return !m_Breakpoints->isSkipping();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDebuggerUI::CPUStep()
|
void CDebuggerUI::CPUStep()
|
||||||
|
|
|
@ -56,7 +56,7 @@ private:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void TLBChanged(void);
|
void TLBChanged(void);
|
||||||
bool CPUStepStarted(void);
|
void CPUStepStarted(void);
|
||||||
void CPUStep(void);
|
void CPUStep(void);
|
||||||
void FrameDrawn(void);
|
void FrameDrawn(void);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue