我该如何诊断这次崩溃?

时间:2012-02-14 18:48:07

标签: visual-c++ postmortem-debugging

Map文件如下所示:

0002:000442e4 00000118H .idata$2                DATA   
0002:000443fc 00000014H .idata$3                DATA   
0002:00044410 00000b7cH .idata$4                DATA   
0002:00044f8c 0000512eH .idata$6                DATA   
0002:0004a0ba 00000000H .edata                  DATA   

崩溃信息如下:

Application Error : The instruction at "0x00458ae1" referenced memory at "0x00000074". The memory could not be "read".

我正在尝试在下一次崩溃时获得堆栈转储,但在我看来,这是我们破坏堆栈然后执行返回的情况,这使我们最终执行数据。

我不完全确定,因为我读过这样的文章:Under the Hood Article似乎表明这是一个导入方法名称的区域

  

保留导入库为导入的API提供的数据   在几个名称都以.idata开头的部分中(例如,   .idata $ 4,.idata $ 5和.idata $ 6)。 .idata $ 5部分包含一个   单个DWORD,当可执行文件加载时,包含地址   导入的功能。 .idata $ 6部分(如果存在)包含   导入函数的名称。将可执行文件加载到   内存,Win32加载程序使用此字符串来调用GetProcAddress   有效的导入功能。

没有堆栈回溯我有点卡住了。我是以错误的方式看待这次撞车吗?

1 个答案:

答案 0 :(得分:2)

忘记MAP文件,更好地使用PDB文件。对于此启用链接器选项 / DEBUG - 是的,即使对于发布版本也是如此。 / DEBUG是链接器选项,_DEBUG是编译器选项。只有_DEBUG控制代码,以及源/标头对此进行的任何条件编译。

调试版本禁用了优化,启用了_DEBUG宏。 发布版本已启用优化,_DEBUG宏已禁用。 / DEBUG只是将调试信息放入EXE / DLL中,并且不会影响其他任何内容。

当发生崩溃时回到问题。当WER(Windows错误报告)说它崩溃时,请勿关闭应用程序。而是将其保留在那里,转到任务管理器,转到进程选项卡,选择崩溃/崩溃进程,然后点击“创建转储文件”。将在某个本地文件夹中创建转储文件(完全转储)(该路径将由任务管理器显示)。您现在可以关闭崩溃的应用程序(WER窗口)。

现在将此.DMP文件复制到某个安全位置,最好是包含原始Release文件夹的文件夹。在Visual Studio或WinDbg中打开它。在VS上,只需按F11 / F10,您将看到调用堆栈。如果多个线程正在运行(在崩溃的应用程序中),启动“线程”视图,并查看唯一挂起的线程,双击它,您将找到崩溃位置。

你必须拥有正确的PDB以及所有二进制文件,并且代码完全相同,否则调用堆栈不会很好。

要获得有关PDB和内容的更多信息,请阅读this article