我正在分析在使用本机库和托管代码时发生的死锁。我正在使用WinDbg调试问题,目的是保存转储,以便供应商可以在他们的场所观察问题。
当附加到有问题的进程时,我会在任何调用堆栈之前看到以下消息:
警告:堆栈展开信息不可用。以下帧可能是错误的。
直接连接到流程时,框架实际上看起来是正确的。但是,当我转储此文件,然后在另一台机器上打开WinDbg中的转储时,其中一个堆栈帧不同(上面的错误也显示出来。)这原本让供应商难倒,因为代码路径似乎不可能
我使用以下方式进行转储:
.dump /ma filename.dmp
导致这种差异的原因是什么,我能做些什么来可靠地分析转储文件的调用堆栈?可能还有其他我应该注意的误传数据吗?
答案 0 :(得分:2)
这听起来像你可能有不匹配的pdbs。您是否尝试过!chksym
和!itoldyouso
命令?例如,见the Bugslayer article
要尝试的另一件事是!sym noisy
,它应该显示正在加载哪些pdb文件。
答案 1 :(得分:2)
警告告诉您调试器无法将堆栈上的一个或多个地址与现有模块信息相关联。由于托管代码是由CLR动态编译的,因此代码没有相应的模块,因此没有警告。
SOS命令!clrstack具有来自CLR的必要信息以显示有意义的堆栈(或至少没有警告)。如果使用任何本机堆栈转储命令,您将看到托管代码的此警告。
即将出版的书籍Advanced .NET Debugging还有其他详细信息。见http://advanceddotnetdebugging.com/