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

handler specified by signal() was not called

本文关键字:处理 程序 调用 signal      更新时间:2023-10-16

我正在尝试在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: %sn",e);
// return control to default handler
previousHandler(SIGSEGV);
}
}

在Windows上,信号系统及其支持功能是与POSIX(类Unix系统,如Linux或macOS(的小型兼容层的一部分。因此,许多POSIX标准信号并未真正实现并且不起作用。

在Windows中不起作用的一个此类信号是分段错误信号SIGSEGV

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