обработчик, указанный в signal (), не был вызван - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь распечатать стек вызовов при исключении в программе 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);
    }
}

1 Ответ

0 голосов
/ 29 августа 2018

В Windows сигнальная система и ее поддерживающие функции являются частью небольшого уровня совместимости с POSIX (Unix-подобные системы, такие как Linux или macOS). Таким образом, многие из стандартных сигналов POSIX не реализованы и не работают.

Одним из таких сигналов, который не работает в Windows, является сигнал ошибки сегментации SIGSEGV.

На уровне консоли (CRT), который является уровнем поверх систем WIN32, могут быть реализованы определенные сигналы. И есть другие системы совместимости POSIX (например, Cygwin), которые также имеют свою собственную реализацию сигналов. Для прямых программ WIN32 такой совместимости нет.

...