未调用 signal() 指定的处理程序
handler specified by signal() was not called
我正在尝试在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 程序,没有这样的兼容性。
相关文章:
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 为什么我的 IExtractIcon 处理程序没有被调用?
- 在遍历处理程序的向量时注册和注销处理程序
- 有可能在信号处理程序中设置promise吗
- 在信号处理程序中捕获C++未处理的异常并恢复应用程序
- 通过安装信号处理程序关闭多线程应用程序
- QDateTime::toString() 在退出处理程序中使用时失败
- 如何在 WindowProc 处理程序中区分箭头键和数字键盘?
- async_write完成处理程序最早何时完成?
- C++事件系统 - 多态事件和事件处理程序
- 具有shared_ptr的处理程序中的分段错误
- 为什么我的信号处理程序只执行一次?
- GTK C++:找不到信号处理程序 您是否使用 -rdynamic 进行了编译?
- 如何使用从处理程序调度的最终回调将响应异步返回给调用方on_read?
- C++ 在信号处理程序后继续执行
- wxWidgets 拖放文件事件处理程序初始化问题(无效static_cast)
- 某些 boost::asio 异步函数是否将处理程序连接到操作,以便处理程序被触发一次?
- 没有信号处理程序的POSIX定时器的目的是什么?
- 处理程序的模块列表中有一个错误的模块"WebSocketModule"