Windows/C:是否可以找到引发异常的代码行,其中包含“异常偏移”

新手上路,请多包涵

我们的一位用户在我们的产品启动时遇到了异常。她从 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

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

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

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

我希望我的问题不要太天真。

原文由 Pavel 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 439
2 个回答

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

虽然这向您展示了陈述,但这通常不足以诊断原因。 0xc0000005 异常是访问冲突,它有很多可能的原因。通常你甚至没有得到任何代码,程序可能由于堆栈损坏而被遗忘。或者真正的问题在很远的地方,一些破坏堆的指针操作。您通常还需要一个堆栈跟踪来显示程序是如何在被炸毁的语句处结束的。

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

为了使这一过程顺利进行,您确实希望使此过程自动化。您会在我的回答中找到 提示

原文由 Hans Passant 发布,翻译遵循 CC BY-SA 3.0 许可协议

与基于运行时的元数据感知语言(如 .NET 或 Java)不同,源代码信息不会保留在编译后的 C++ 代码中。 PDB 文件是一个符号索引,它可以帮助调试器将编译后的代码映射回源代码,但它必须在程序执行期间完成,而不是从故障转储中完成。即使使用 PDB,发布编译的代码也会受到许多优化,这些优化可能会阻止调试器识别源代码。

仅在最终用户机器上出现的调试问题通常需要仔细的状态日志记录以及大量针对细节的时间和精力对源代码进行梳理。根据您与用户的关系(例如,如果您是企业内部的 IT 开发人员),您可能能够制作用户机器的虚拟机映像并将其用于调试,这可以通过精确地帮助极大地加快进程在用户工作站上复制已安装的软件和标准运行进程。

原文由 Dan Story 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题