Windows/C++:是否有可能找到抛出异常的代码行,其中包含"Exception Offset"

Pav*_*vel 43 c++ windows exception

我们的一位用户在我们的产品启动时遇到异常.她从Windows发送了以下错误消息:

  Problem Event Name:                        APPCRASH
  Application Name:                          program.exe
  Application Version:                       1.0.0.1
  Application Timestamp:                     4ba62004
  Fault Module Name:                         agcutils.dll
  Fault Module Version:                      1.0.0.1
  Fault Module Timestamp:                    48dbd973
  Exception Code:                            c0000005
  Exception Offset:                          000038d7
  OS Version:                                6.0.6002.2.2.0.768.2
  Locale ID:                                 1033
  Additional Information 1:                  381d
  Additional Information 2:                  fdf78cd6110fd6ff90e9fff3d6ab377d
  Additional Information 3:                  b2df
  Additional Information 4:                  a3da65b92a4f9b2faa205d199b0aa9ef
Run Code Online (Sandbox Code Playgroud)

是否可以在源代码中找到具有此信息的异常的确切位置?

Windows上的C++程序员找到用户计算机上发生错误的位置的常用技术是什么?

我们的项目使用Release配置编译,生成PDB文件.

我希望我的问题不太天真.

Han*_*ant 68

是的,这是可能的.使用与用户运行的完全相同的二进制文件开始调试,确保已加载DLL并且您已获得匹配的PDB文件.在Debug + Windows + Modules中查找DLL基址.添加偏移量.Debug + Windows + Disassembly并在Address字段中输入计算的地址(前缀为0x).这会向您显示导致异常的确切机器代码指令.右键单击+转到源代码以查看匹配的源代码行.

虽然这显示了声明,但这通常不足以诊断原因.0xc0000005异常是一种访问冲突,它有许多可能的原因.通常你甚至没有得到任何代码,由于堆栈损坏,程序可能已经被遗忘了.或者真正的问题位于远处,一些指针操作破坏了堆.您通常还需要一个堆栈跟踪,向您展示程序如何在轰炸声明中结束.

你需要的是一个小型转储.如果她运行Vista或Win7,您可以轻松地从用户那里获得一个.启动TaskMgr.exe,进程选项卡,选择被轰炸的程序,同时它仍然显示崩溃对话框.右键单击它并创建转储文件.

为了使这个顺利,你真的想要自动化这个过程.您将在此主题中找到我的答案中的提示.

  • 在问题实际发生时制作minidump的好方法你可以使用"SetUnhandledExceptionFilter()"告诉操作系统调用你定义的另一个函数是"catasrophic事件,例如访问冲突."在这个函数中你可以加载(动态)使用LoadLibrary/GetProcAdderss)来自dbghelp.dll的函数MiniDumpWriteDump()并在应用程序死亡之前编写minidump :-).稍后您可以加载minidump.它是一个惊人的帮助! (4认同)