我知道当应用程序崩溃时,系统会报告它在mydll.dll中的位置0x00004b79处崩溃。我有源代码,我有二进制文件,但我没有PDB或该DLL构建的任何列表文件。
崩溃是可重复的,但我无法在生产计算机上安装调试器,并且在开发或调试环境中不会发生崩溃。我已经设置了Dr. Watson,我有一个故障转储和Dr. Watson日志文件。
Dr. Watson日志文件包含正在执行的函数的反汇编:
10604b70 8b442408 mov eax,[esp+0x8]
10604b74 8b542404 mov edx,[esp+0x4]
10604b78 50 push eax
FAULT ->10604b79 8b4120 mov eax,[ecx+0x20] ds:0023:00000020=????????
10604b7c 52 push edx
10604b7d 6801800000 push 0x8001
10604b82 50 push eax
10604b83 ff156c946210 call dword ptr [mydll!DllUnregisterServer+0x1720c (1062946c)]
10604b89 c20800 ret 0x8
(INT 3说明位于上面的汇编代码段之前并继承。)
堆栈跟踪仅包含地址mydll + 0x4b79。它没有给出任何来电者信息。
在windbg中加载崩溃转储并未提供任何其他信息。
如何确定发生崩溃的功能(甚至更好的代码)?
答案 0 :(得分:2)
创建应用程序的崩溃转储并使用调试器对其进行exmaine,WinDbg在这里是显而易见的选择。崩溃转储将为您提供堆栈跟踪和详细的错误信息。
编辑:至于无法安装调试器,DrWatson已预先安装并能够生成故障转储,然后可以在另一台计算机上进行检查。