我们的一位用户在我们的产品启动时遇到异常。
她从 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
是否可以通过此信息在源代码中找到发生异常的确切位置?
Windows 上的 C++ 程序员定位用户计算机上发生错误的位置的常用技术是什么?
我们的项目是使用Release配置编译的,生成PDB文件。
我希望我的问题不是太天真。
是的,这是可能的。使用与用户运行的完全相同的二进制文件开始调试,确保 DLL 已加载并且您已获得与其匹配的 PDB 文件。在“调试”+“Windows”+“模块”中查找 DLL 基地址。添加偏移量。调试+Windows+反汇编并在地址字段中输入计算出的地址(前缀为0x)。这会向您显示导致异常的确切机器代码指令。右键单击 + 转到源代码可查看匹配的源代码行。
虽然这向您显示了该声明,但这通常不足以诊断原因。 0xc0000005异常是一个访问冲突,它有很多可能的原因。通常,您甚至没有获得任何代码,程序可能由于堆栈损坏而被遗忘。或者真正的问题位于很远的地方,一些指针操作损坏了堆。通常,您还确实需要一个堆栈跟踪来显示程序如何在崩溃的语句处结束。
您需要的是一个小型转储。如果您的用户运行 Vista 或 Win7,您可以轻松地从她那里获得一个。启动TaskMgr.exe,进程选项卡,在仍显示崩溃对话框时选择被轰炸的程序。右键单击它并创建转储文件。
为了使这一过程顺利进行,您确实希望使该过程自动化。你会在我的回答中找到提示这个线程 https://stackoverflow.com/questions/1964478/displaying-exception-debug-information-to-users.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)