【发布时间】:2018-08-29 09:11:20
【问题描述】:
我正在尝试在 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);
}
}
【问题讨论】:
-
我会说你正在做的事情是糟糕的! 信号处理程序不像代码中的普通函数那样被调用,现在抛出异常可能会起作用或甚至是明确定义(或完全定义)。
-
当引发未捕获的异常时,代码看起来像您正在尝试收集诊断信息。您可能想查看MiniDumpWriteDump,而不是使用某种堆栈遍历代码。这将生成更多有价值的信息,并且不需要您发送 PDB 文件。还要查看SetUnhandledExceptionFilter,这就是你应该使用的。
-
@IInspectable 非常感谢!!
标签: c++ winapi exception signals handler