目前我使用SetUnhandledExceptionFilter()提供回调以在发生未处理的异常时获取信息,该回调将为我提供EXCEPTION_RECORD,提供ExceptionAddress
。
[1]实际上ExceptionAddress
是什么?它是提供异常的函数/代码的地址,还是某个函数试图访问的内存地址?
[2]有没有更好的机制可以在未处理的异常发生时给我更好的信息? (我不能使用调试模式或添加任何影响运行时性能的代码,因为崩溃很少见,只有在代码运行得尽快时才在发布版本中运行)
[3]当有未处理的异常发生时,我有什么方法可以得到几个callstack地址。
[4]假设ExceptionAddress
有地址A,我在基地址A-x
加载并运行了DLL X,而在A+y
处有一些其他DLL Y,这是好的假设由于DLL X上的代码导致崩溃 PROBABLY ?
答案 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”的改进版本。但是现在找不到网站。