未调用signal()指定的处理程序

时间:2018-08-29 09:11:21

标签: c++ winapi exception signals handler

我试图在Win32 / C ++程序中异常时打印调用堆栈。

this的文章中,我学习了一种在访问冲突时调用我的处理程序的方法。但是,这似乎仅在简单的控制台程序中有效。

将相同的代码复制到带有消息泵的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 :(得分:0)

在Windows上,信号系统及其支持功能是POSIX(类似于Unix的系统,如Linux或macOS)的小型兼容性层的一部分。因此,许多POSIX标准信号都没有真正实现,因此无法正常工作。

分段错误信号SIGSEGV在Windows中不起作用。

控制台层(CRT)是WIN32系统之上的一层,可能已实现某些信号。还有其他POSIX兼容性系统(例如Cygwin)也有自己的信号实现。对于直接的WIN32程序,没有这种兼容性。