Я пытаюсь распечатать стек вызовов при исключении в программе Win32 / C ++.
Из этой статьи я узнал, как заставить моего обработчика вызывать нарушение прав доступа. Но, похоже, это работало только в простых консольных программах.
После того, как я скопировал тот же код в программу win32 с обработчиком сообщений, мой обработчик не был вызван.
Я думаю, что часть установки ловушки такая же, и единственное отличие состоит в том, что злой код для запуска нарушения доступа вызывается не вскоре после установки обработчика, а из-за того, что несколько сообщений откачано от установки обработчика.
У кого-нибудь есть подсказка о том, почему мой обработчик не был вызван?
Позвольте мне попытаться объяснить мой код, как показано ниже:
void SignalHandler_SegmentViolation(int signal)
{
StackWalker sw;
sw.ShowCallstack();
throw "!Access Violation!";
}
void someFuncionCalledUponButtonClick()
{
*(int*)0x00 = 5;
}
void myMsgPump()
{
while(TRUE)
{
GetMessage(&msg, NULL, 0, 0);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst,LPSTR lpszArgs, int nWinMode)
{
typedef void (*SignalHandlerPointer)(int);
SignalHandlerPointer previousHandler;
previousHandler = signal(SIGSEGV , SignalHandler_SegmentViolation);
try
{
myMsgPump();
}
catch(char *e)
{
printf("Exception Caught: %s\n",e);
// return control to default handler
previousHandler(SIGSEGV);
}
}