DBG: added the exinfo command (extended information on the last exception)
This commit is contained in:
parent
069f524500
commit
9ee48b630b
|
@ -70,6 +70,7 @@ static HANDLE hTimeWastedCounterThread = 0;
|
||||||
static bool bStopTimeWastedCounterThread = false;
|
static bool bStopTimeWastedCounterThread = false;
|
||||||
static String lastDebugText;
|
static String lastDebugText;
|
||||||
static duint timeWastedDebugging = 0;
|
static duint timeWastedDebugging = 0;
|
||||||
|
static EXCEPTION_DEBUG_INFO lastExceptionInfo = { 0 };
|
||||||
char szFileName[MAX_PATH] = "";
|
char szFileName[MAX_PATH] = "";
|
||||||
char szSymbolCachePath[MAX_PATH] = "";
|
char szSymbolCachePath[MAX_PATH] = "";
|
||||||
char sqlitedb[deflen] = "";
|
char sqlitedb[deflen] = "";
|
||||||
|
@ -854,6 +855,11 @@ bool cbSetModuleBreakpoints(const BREAKPOINT* bp)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXCEPTION_DEBUG_INFO getLastExceptionInfo()
|
||||||
|
{
|
||||||
|
return lastExceptionInfo;
|
||||||
|
}
|
||||||
|
|
||||||
static bool cbRemoveModuleBreakpoints(const BREAKPOINT* bp)
|
static bool cbRemoveModuleBreakpoints(const BREAKPOINT* bp)
|
||||||
{
|
{
|
||||||
if(!bp->enabled)
|
if(!bp->enabled)
|
||||||
|
@ -1533,6 +1539,8 @@ static void cbException(EXCEPTION_DEBUG_INFO* ExceptionData)
|
||||||
callbackInfo.Exception = ExceptionData;
|
callbackInfo.Exception = ExceptionData;
|
||||||
unsigned int ExceptionCode = ExceptionData->ExceptionRecord.ExceptionCode;
|
unsigned int ExceptionCode = ExceptionData->ExceptionRecord.ExceptionCode;
|
||||||
GuiSetLastException(ExceptionCode);
|
GuiSetLastException(ExceptionCode);
|
||||||
|
if(ExceptionData)
|
||||||
|
lastExceptionInfo = *ExceptionData;
|
||||||
|
|
||||||
duint addr = (duint)ExceptionData->ExceptionRecord.ExceptionAddress;
|
duint addr = (duint)ExceptionData->ExceptionRecord.ExceptionAddress;
|
||||||
if(ExceptionData->ExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT)
|
if(ExceptionData->ExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT)
|
||||||
|
|
|
@ -121,6 +121,7 @@ void cbRunToUserCodeBreakpoint(void* ExceptionAddress);
|
||||||
DWORD WINAPI threadAttachLoop(void* lpParameter);
|
DWORD WINAPI threadAttachLoop(void* lpParameter);
|
||||||
void cbDetach();
|
void cbDetach();
|
||||||
bool cbSetModuleBreakpoints(const BREAKPOINT* bp);
|
bool cbSetModuleBreakpoints(const BREAKPOINT* bp);
|
||||||
|
EXCEPTION_DEBUG_INFO getLastExceptionInfo();
|
||||||
|
|
||||||
//variables
|
//variables
|
||||||
extern PROCESS_INFORMATION* fdProcessInfo;
|
extern PROCESS_INFORMATION* fdProcessInfo;
|
||||||
|
|
|
@ -2754,3 +2754,19 @@ CMDRESULT cbInstrInstrUndo(int argc, char* argv[])
|
||||||
GuiUpdateAllViews();
|
GuiUpdateAllViews();
|
||||||
return STATUS_CONTINUE;
|
return STATUS_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CMDRESULT cbInstrExinfo(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
auto info = getLastExceptionInfo();
|
||||||
|
const auto & record = info.ExceptionRecord;
|
||||||
|
dputs("EXCEPTION_DEBUG_INFO:");
|
||||||
|
dprintf(" dwFirstChance: %X\n", info.dwFirstChance);
|
||||||
|
dprintf(" ExceptionCode: %08X\n", record.ExceptionCode);
|
||||||
|
dprintf(" ExceptionFlags: %08X\n", record.ExceptionFlags);
|
||||||
|
dprintf(" ExceptionAddress: " fhex "\n", record.ExceptionAddress);
|
||||||
|
dprintf(" NumberParameters: %d\n", record.NumberParameters);
|
||||||
|
if(record.NumberParameters)
|
||||||
|
for(DWORD i = 0; i < record.NumberParameters; i++)
|
||||||
|
dprintf("ExceptionInformation[%02d]: " fhex "\n", i, record.ExceptionInformation[i]);
|
||||||
|
return STATUS_CONTINUE;
|
||||||
|
}
|
||||||
|
|
|
@ -99,5 +99,6 @@ CMDRESULT cbInstrDisableGuiUpdate(int argc, char* argv[]);
|
||||||
CMDRESULT cbInstrEnableGuiUpdate(int argc, char* argv[]);
|
CMDRESULT cbInstrEnableGuiUpdate(int argc, char* argv[]);
|
||||||
CMDRESULT cbInstrExhandlers(int argc, char* argv[]);
|
CMDRESULT cbInstrExhandlers(int argc, char* argv[]);
|
||||||
CMDRESULT cbInstrInstrUndo(int argc, char* argv[]);
|
CMDRESULT cbInstrInstrUndo(int argc, char* argv[]);
|
||||||
|
CMDRESULT cbInstrExinfo(int argc, char* argv[]);
|
||||||
|
|
||||||
#endif // _INSTRUCTION_H
|
#endif // _INSTRUCTION_H
|
||||||
|
|
|
@ -301,6 +301,7 @@ static void registercommands()
|
||||||
dbgcmdnew("guiupdatedisable", cbInstrDisableGuiUpdate, true); //disable gui message
|
dbgcmdnew("guiupdatedisable", cbInstrDisableGuiUpdate, true); //disable gui message
|
||||||
dbgcmdnew("guiupdateenable", cbInstrEnableGuiUpdate, true); //enable gui message
|
dbgcmdnew("guiupdateenable", cbInstrEnableGuiUpdate, true); //enable gui message
|
||||||
dbgcmdnew("exhandlers", cbInstrExhandlers, true); //enumerate exception handlers
|
dbgcmdnew("exhandlers", cbInstrExhandlers, true); //enumerate exception handlers
|
||||||
|
dbgcmdnew("exinfo", cbInstrExinfo, true); //dump last exception information
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool cbCommandProvider(char* cmd, int maxlen)
|
static bool cbCommandProvider(char* cmd, int maxlen)
|
||||||
|
|
Loading…
Reference in New Issue