SOS不支持当前的目标体系结构

时间:2013-05-07 15:13:00

标签: c# .net-4.0 windbg dump hang

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

.loadby sos clr
.load wow64exts
!sw
kL

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

4 个答案:

答案 0 :(得分:24)

我相信您必须使用位于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

答案 1 :(得分:14)

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

我能够使用poizan42 on GitHub中的soswow64 WinDbg扩展来解决问题。我通过this blog entry找到了它,它还提供了有关该问题的更详细信息。

答案 2 :(得分: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位,则必须   使用32位版本的DAC,这反过来意味着你的   检查程序也需要32位。同样如此   64位进程。确保您的程序平台与之匹配   你正在调试。“

答案 3 :(得分:2)

还有一个选项对我有用: - 我有一个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.aspxhttp://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>

在此之后,!线程工作。我认为,同样适用于32位崩溃转储。