最近我们遇到了应用程序冻结的生产问题,我们试图打破并分析转储文件,遗憾的是转储文件的调用堆栈看起来并不好,很难找到冻结的原因。
答案 0 :(得分:1)
调用堆栈可能看起来不正确的两个原因:
堆栈可能已损坏。如果堆栈由于某种原因而损坏(例如,由于堆栈上分配的缓冲区溢出),则所有堆栈帧都将被销毁。这使得无法计算呼叫者列表。
您使用的符号(如果有)可能不适合崩溃的二进制文件。您需要使用编译二进制文件时使用的完全相同的符号。对源代码稍作更改会导致所有符号无效。
答案 1 :(得分:0)
如果应用程序挂起而不是崩溃,请尝试加载到windbg并运行!analyze -v -hang
或尝试在挂起模式下使用adplus。这会尝试确定挂起的原因,它应该为您提供更有意义的调用堆栈。如果您通过向您显示资源上阻塞的内容而导致死锁,那么!locks
命令也很有用。
答案 2 :(得分:0)
如果你调用Windows API,然后在同一个线程(例如通过Windows消息处理程序)回调你,那么Windows DLL中的操作使用调试器不能的堆栈约定并不罕见解读。在执行c / c ++函数/方法期间,不要求堆栈始终可跟踪,堆栈相关的寄存器可以重复用于其他目的,并且可以忽略存储堆栈信息的标准位置。我在Windows中看到了很多。