C ++ Win32 Unhandled Exception Handler

时间:2010-03-20 09:54:37

标签: c++ exception dll crash callback

目前我使用SetUnhandledExceptionFilter()提供回调以在发生未处理的异常时获取信息,该回调将为我提供EXCEPTION_RECORD,提供ExceptionAddress

[1]实际上ExceptionAddress是什么?它是提供异常的函数/代码的地址,还是某个函数试图访问的内存地址?

[2]有没有更好的机制可以在未处理的异常发生时给我更好的信息? (我不能使用调试模式或添加任何影响运行时性能的代码,因为崩溃很少见,只有在代码运行得尽快时才在发布版本中运行)

[3]当有未处理的异常发生时,我有什么方法可以得到几个callstack地址。

[4]假设ExceptionAddress有地址A,我在基地址A-x加载并运行了DLL X,而在A+y处有一些其他DLL Y,这是好的假设由于DLL X上的代码导致崩溃 PROBABLY

3 个答案:

答案 0 :(得分:5)

(1)ExceptionAddress是导致异常的代码的地址。在访问冲突错误(0xC0000005)的情况下,异常记录的附加参数之一保存尝试读取或写入的地址,另一个参数指示它是读取还是写入。这在您在问题中提供的链接中有记录。

(2)没有。此外,将调试信息添加到发布版本不会影响性能。您可以对此进行验证并亲自查看。

(3)dbghelp.dll提供了一个完整的库来调查崩溃。在athers中有StackWalk64,它允许你获得完整的崩溃堆栈。

(4)使用ExceptionAddress作为参数调用GetModuleHandleEx将获得有问题的代码所在的dll的句柄。至于哪个DLL CAUSED 崩溃的问题,这取决于您对“ CAUSED ”的定义。在一个dll中发生的崩溃可能是完全不同且无关的dll中的错误的结果。

答案 1 :(得分:0)

不直接回答您的问题,但可能这就是您所需要的: http://www.codeproject.com/KB/debug/postmortemdebug_standalone1.aspx

当程序在客户端计算机上的Release版本中运行时,事后调试是查找异常位置的方法。

答案 2 :(得分:0)

此外,不是对您的问题的直接回答,但我认为它可以帮助您:

http://www.codeproject.com/KB/applications/blackbox.aspx

它将为屏幕或文件生成可读输出,它将为您提供堆栈输出,以查找发生异常的位置以及其他有用信息。

这对我有用。

还有一个名为“Blackbox modified”的改进版本。但是现在找不到网站。