我有一个客户遇到了 100% 可重现的崩溃,我无法在 Visual Studio 2005 中编译的程序中复制该崩溃。我向他们发送了我的程序的调试版本,并将所有 PDB 和 DLL 文件放在手边。他们向我发送了 minidump 文件,但是当我打开它时,我得到:
“MiniDump.dmp 中 0x00000000 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000000。”
然后调用堆栈只显示“0x00000000()”,反汇编显示0x0处的内存转储。我已经设置了符号服务器,加载了我的 PDB 符号等。但是我看不出有任何方法可以知道许多 DLL 中的哪一个实际上导致了跳转到 null。这是一个具有许多依赖项的大型项目,其中一些是我没有源或 PDB 的二进制文件,因为我使用 API 作为第 3 方。
那么这个小型转储到底有什么用呢?如何查看导致崩溃的 DLL?我以前从未真正使用 minidump 进行调试,但我读过的所有教程似乎至少显示了一个函数名称或其他可以在调用堆栈中为您提供线索的内容。我只是得到指向空值的一行。
我还尝试使用“Depends”来查看是否存在一些未解决的 DLL 依赖项;但是在我的三台装有各种 Windows 操作系统的测试机器上,我似乎得到了三组不同的操作系统 DLL 依赖项(但无法复制崩溃);所以这似乎也不是诊断问题的特别可靠的方法。
还有哪些其他方法可以确定此问题的原因?有什么方法可以退回一条指令以查看哪个 DLL 跳转到空值?