2012-02-14 92 views
0

地图文件看起来像:如何诊断此次崩溃?

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。

没有堆栈回溯我有点卡住了。我看着这次崩溃是错误的吗?

回答

2

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

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

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

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

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

想要了解更多关于PDB和东西的信息,你可以阅读this article