我们的一位用户在我们的产品启动时遇到了异常。她从 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 许可协议
是的,这是可能的。使用与您的用户运行的完全相同的二进制文件开始调试,确保已加载 DLL 并且您已获得匹配的 PDB 文件。在 Debug + Windows + Modules 中查找 DLL 基地址。添加偏移量。调试 + Windows + 反汇编并在地址字段中输入计算的地址(前缀为 0x)。这向您显示了导致异常的确切机器代码指令。右键单击 + 转到源代码以查看匹配的源代码行。
虽然这向您展示了陈述,但这通常不足以诊断原因。 0xc0000005 异常是访问冲突,它有很多可能的原因。通常你甚至没有得到任何代码,程序可能由于堆栈损坏而被遗忘。或者真正的问题在很远的地方,一些破坏堆的指针操作。您通常还需要一个堆栈跟踪来显示程序是如何在被炸毁的语句处结束的。
你需要的是一个小型转储。如果她运行 Vista 或 Win7,您可以轻松地从您的用户那里获得一个。启动TaskMgr.exe,进程选项卡,在它仍然显示崩溃对话框时选择被轰炸的程序。右键单击它并创建转储文件。
为了使这一过程顺利进行,您确实希望使此过程自动化。您会在我的回答中找到 提示。