1

我正在分析将本机库与托管代码一起使用时发生的死锁。我正在使用 WinDbg 来调试问题,目的是保存转储,以便供应商可以在他们的场所观察到问题。

附加到有问题的进程时,我在任何调用堆栈之前看到以下消息:

警告:堆栈展开信息不可用。以下框架可能是错误的。

当直接连接到进程时,框架实际上看起来是正确的。但是,当我对该文件进行转储,然后在另一台机器上的 WinDbg 中打开转储时,其中一个堆栈帧是不同的(也显示了上述错误。)这最初让供应商难住了,因为代码路径似乎不可能.

我使用以下方式进行转储:

.dump /ma filename.dmp

什么会导致这种差异,我能做些什么来可靠地分析转储文件的调用堆栈?可能还有其他我应该注意的歪曲数据吗?

4

2 回答 2

2

警告告诉您调试器无法将堆栈上的一个或多个地址与现有模块信息相关联。由于托管代码是由 CLR 动态编译的,因此代码没有相应的模块,因此会出现警告。

SOS 命令 !clrstack 具有来自 CLR 的必要信息以显示有意义的堆栈(或至少没有警告)。如果您使用任何本机堆栈转储命令,您将看到托管代码的此警告。

即将出版的《高级 .NET 调试》一书有更多详细信息。请参阅http://advanceddotnetdebugging.com/

于 2009-11-03T09:30:17.163 回答
2

这听起来像你可能有不匹配的 pdb。您是否尝试过!chksymand!itoldyouso命令?例如参见Bugslayer 文章

要尝试的另一件事是!sym noisy应该向您显示正在加载哪些 pdb 文件。

另请参阅MSDN 博客

于 2009-11-03T09:24:27.660 回答