Windows / C ++:是否有可能findexception被抛出的代码行有“Exception Offset”
我们的一位用户在我们的产品启动时出现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
有没有可能find发生exception的源代码中的确切位置?
Windows上的C ++程序员常用的技术是如何定位在用户计算机上发生的错误的位置?
我们的项目是用Releaseconfiguration编译的,生成了PDB文件。
我希望我的问题不是太天真。
是的,这是可能的。 用与用户运行完全相同的二进制文件开始debugging,确保DLL已经加载,并且已经有一个匹配的PDB文件。 在Debug + Windows +模块中查找DLL基址。 添加偏移量。 debugging+ Windows +反汇编,并在地址栏中input计算出的地址(前缀为0x)。 这将显示导致exception的确切机器码指令。 右键单击+转到源代码查看匹配的源代码行。
虽然这表明你的声明,这通常不足以诊断原因。 0xc0000005exception是一个访问冲突,它有很多可能的原因。 通常你甚至没有得到任何代码,由于堆栈损坏,程序可能已经被遗忘了。 或者真正的问题位于远处,一些破坏堆的指针操作。 你通常还需要一个堆栈跟踪,告诉你程序是如何在被轰炸的声明中结束的。
你需要的是一个小型转储。 如果她运行Vista或Win7,你可以很容易地从你的用户那里得到一个。 启动TaskMgr.exe,进程选项卡,select轰炸的程序,同时它仍然显示崩溃对话框。 右键单击它并创build转储文件。
为了使这个顺利,你真的想自动化这个过程。 你会在我的回答中find提示。
如果您有一个小型转储,请在Visual Studio中打开它,将MODPATH设置为具有原始二进制文件和PDB的相应文件夹,并告诉它“运行”。 您可能还需要告诉它从Microsoft符号服务器加载符号。 它将在错误位置显示调用堆栈。 如果您尝试查看特定堆栈位置的源代码,它可能会问您在哪里源; 如果是这样,请select适当的源文件夹。 在具有minidump文件名的“project”的debug命令行属性中设置MODPATH。
与基于运行时的元数据感知型语言(如.NET或Java)不同,源代码信息不会保存在已编译的C ++代码中。 PDB文件是一个符号索引,它可以帮助debugging器将编译后的代码映射到源代码,但它必须在程序执行期间完成,而不是从崩溃转储中完成。 即使使用PDB,释放编译的代码也会受到一系列优化,从而阻止debugging器识别源代码。
debugging只在最终用户机器上出现的问题通常是仔细的状态logging和大量的细节导向的时间和精力。 根据您与用户的关系(例如,如果您是企业内部IT开发人员),您可以创build用户计算机的虚拟机映像并将其用于debugging,这可以帮助您精确地加速过程在用户的工作站上复制安装的软件和标准运行stream程。
我知道这个post已经很老了,但这是Google的回应,所以我想添加我的$ .02。
虽然小转储是最有用的,只要你已经编译你的代码启用符号(只发送文件没有.pdb,并保持.pdb!),你可以查找什么行这是使用MSVCdebugging器或Windowsdebugging器。 MSN上的文章: