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

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

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

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

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

.dump /ma filename.dmp

什么会导致这种差异,我可以采取什么措施来可靠地分析转储文件的调用堆栈?是否还有其他我应该注意的歪曲数据?

有帮助吗?

解决方案

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

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

也可以看看 MSDN 博客

其他提示

在警告,告诉您调试器不能堆与现有的模块信息上的一个或多个地址相关联。托管代码由编译CLR在飞行存在针对码没有相应的模块,因此警告。

在SOS命令!clrstack具有从CLR必要的信息,以显示一个有意义的叠层(或至少没有警告)。如果你使用任何天然堆栈转储命令,你会看到这样的警告托管代码。

在即将出版的新书高级.NET调试有额外的细节。请参阅 http://advanceddotnetdebugging.com/

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top