C++ Win32 Unhandled Exception Handler

ura*_*ray 3 c++ crash dll exception callback

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

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

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

[3]有什么办法让我在未处理的异常发生时得到几个callstack地址.

[4]假设ExceptionAddress具有地址A,我已经DLL X加载并在基地址执行A-x,以及其它一些DLL的Y A+y,是好假设碰撞被PROBABLY由DLL X代码引起的?

sho*_*osh 5

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

(2)没有.此外,将调试信息添加到发布版本不会影响性能.您可以验证这一点并亲眼看看.

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

(4)GetModuleHandleEx使用ExceptionAddressas作为参数调用将获得有问题的代码所在的dll的句柄.至于其中的DLL问题引起的死机,这取决于你的"的定义造成的 ".在一个dll中发生的崩溃可能是完全不同且无关的dll中的错误的结果.