Pie*_*ers 7 debugging minidump visual-studio-2005 visual-c++
我有一个客户正在获得100%可重现的崩溃,我无法在我在Visual Studio 2005中编译的程序中复制.我向他们发送了我的程序的调试版本,并保留了所有PDB和DLL文件.他们发给我minidump文件,但当我打开它时,我得到:
"MiniDump.dmp中0x00000000处的未处理异常:0xC0000005:访问冲突读取位置0x00000000."
然后调用堆栈只显示"0x00000000()",反汇编显示内存转储为0x0.我已经设置了符号服务器,加载了我的PDB符号等.但是我看不出有什么方法可以知道哪些DLL实际上导致跳转为null.这是一个包含许多依赖项的大型项目,其中一些是我没有源代码或PDB的二进制文件,因为我使用API作为第三方.
那么这个minidump究竟有用吗?如何查看导致崩溃的DLL?我以前从来没有真正使用minidump进行调试,但我读过的所有教程似乎至少都显示了一个函数名或其他能给你一个调用堆栈线索的东西.我只得到一行指向null.
我也尝试使用"Depends"来查看是否存在一些未解析的DLL依赖项; 但是在我使用各种Windows操作系统的三台测试机器上,我似乎得到了三套不同的OS DLL依赖项(但却无法复制崩溃); 因此,对于诊断问题,这似乎不是一种特别可靠的方法.
有哪些其他方法可用于确定此问题的原因?有没有办法退回一条指令,看看哪个DLL跳转到null?
好吧,看起来这个例子中的答案是"使用WinDbg而不是Visual Studio来调试minidumps".我无法从VS中获得任何有用的信息,但是WinDbg给了我关于导致崩溃的函数调用链的大量信息.
在这种情况下,它仍然没有帮助解决我的问题,因为所有的功能都在我正在使用的第三方库中,所以看起来我唯一的确定答案就是使用日志文件跟踪状态我的应用程序导致崩溃.
我想如果有人在调试minidump时看到一个类似的问题与无用的调用堆栈,最好的做法是用WinDgb而不是Visual Studio打开它.似乎奇怪的是,这项工作的最佳工具是免费的Microsoft产品,而不是商业产品.
这里的另一个教训可能是"任何使用第三方库的程序都需要编写日志文件".
所有“简单”的事后调试方法背后的整个想法是捕获堆栈跟踪。如果您的应用程序覆盖了堆栈,则无法进行此类分析。只有非常复杂的方法(在专用硬件中记录整个程序执行情况)才能有所帮助。
在这种情况下,可以采用的方法是日志文件。在发生故障的区域广泛传播一些日志语句,并将该版本传输给客户。崩溃后,您将在日志文件中看到最后一条日志语句。在该点和下一个尚未记录在日志文件中的日志语句之间添加更多日志语句,再次发布该版本。重复此操作,直到找到导致问题的线路。
我在 ddj.com 上写了一篇关于此问题的两部分文章:
归档时间: |
|
查看次数: |
4970 次 |
最近记录: |