27

我正在尝试使用 windbg 研究在 x64 机器上为我们的 x86 进程创建的挂起转储文件。这是一个 4.0 x86 应用程序,所以为了获得一个非托管堆栈,我必须执行以下操作:

.loadby sos clr
.load wow64exts
!sw
kL

但是,每次我尝试通过获取托管堆栈时,!clrstack我都会在标题中看到错误。我错过了什么?

4

4 回答 4

31

我相信您将不得不使用位于 C:\Windows\SysWOW64\taskmgr.exe 中的 32 位任务管理器来获取 32 位转储。

更多信息在这里:http: //blogs.msdn.com/b/tess/archive/2010/09/29/capturing-memory-dumps-for-32-bit-processes-on-an-x64-machine.aspx

于 2013-05-07T15:27:06.777 回答
18

正如其他人已经说过的,这可能是由 64 位应用程序(例如默认任务管理器)创建 32 位进程的转储文件引起的。

我能够使用GitHub 上 poizan42的 soswow64 WinDbg 扩展来解决问题。我通过这个博客条目找到了它,它还提供了有关该问题的一些更详细的信息。

于 2016-05-18T14:32:39.877 回答
6

我一直遵循比特匹配的建议,但直到我看到这篇文章才知道为什么:http: //blogs.msdn.com/b/dotnet/archive/2013/05/01/net-crash-dump -and-live-process-inspection.aspx声明:

“DAC 有一个标准化的接口,调试器使用它来获取有关这些抽象状态的信息,例如托管堆。必须使用与 CLR 版本和进程架构匹配的 DAC 或崩溃你想检查的垃圾场。”

“请注意,DAC 是本机 DLL,必须加载到使用 ClrMD 的程序中。如果转储或实时进程是 32 位的,则必须使用 DAC 的 32 位版本,这反过来意味着“您的检查程序也需要是 32 位的。对于 64 位进程也是如此。确保您的程序平台与您正在调试的平台相匹配。”

于 2013-05-08T12:10:38.727 回答
3

还有一个对我有用的选项: - 我有一个 64 位进程的崩溃转储。- 所以,首先,我需要进行转储的机器 (C:\Windows\Microsoft.NET\Framework64\v4.0.30319) 中的 SOS.dll 和 mscordacwks.dll。- 基于两篇 msdn 文章 ( http://msdn.microsoft.com/en-gb/library/windows/hardware/ff562263%28v=vs.85%29.aspx , http://msdn.microsoft.com/en -gb/library/windows/hardware/ff540665%28v=vs.85%29.aspx),我这样加载CLR:

.cordll -u -ve -I clr -lp <path to SOS.dll & mscordacwks.dll>

在此之后, !threads 工作。我认为,同样适用于 32 位故障转储。

于 2015-01-13T11:41:28.890 回答