【问题标题】:WinDbg showing different call stacks when attached to process when compared to crash dump与崩溃转储相比,WinDbg 在附加到进程时显示不同的调用堆栈
【发布时间】:2009-11-03 09:10:33
【问题描述】:

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

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

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

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

我使用转储:

.dump /ma filename.dmp

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

【问题讨论】:

    标签: .net windows debugging windbg crash-dumps


    【解决方案1】:

    这听起来你可能有不匹配的 pdb。你试过!chksym!itoldyouso 命令吗?例如见the Bugslayer article

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

    另见MSDN blog

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 谢谢布赖恩。因此,每当调试在 WinDbg 中运行托管代码的线程时,我应该会收到警告?很高兴知道,但是我看到的问题是,与在不同机器上调试转储文件相比,在本地调试时非托管堆栈帧是不同的。谢谢你的链接——我会读一读。
      • 我认为您正在调试托管代码,因为 .NET 标记。如果您为运行托管代码的线程转储本机堆栈,您将看到警告,因为 WinDbg 无法识别托管调用。使用 SOS,您可以获得正确的托管视图,因此不会发出警告。但是,转储本机堆栈仍然很有用,在这种情况下,您只需忽略警告。至于您的另一个问题:您能否详细说明一下本地调试和转储调试之间的堆栈有何不同。
      • 我正在通过互操作调试 .NET 和本机代码的混合体。当我能够重现该问题时,我将提供更多信息。再次感谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-18
      • 2012-03-05
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多