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

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

问题描述:

我正在尝试使用windbg来研究在x64机器上为我们的x86进程创建的挂起转储文件。这是一个4.0 x86的应用程序,所以只是为了得到一个非托管堆栈,我必须做到以下几点:SOS不支持当前目标体系结构

.loadby sos clr 
.load wow64exts 
!sw 
kL 

然而,每次我尝试通过!clrstack我得到错误的标题,以获得托管堆栈。我错过了什么?

+0

您是否在Windows 8计算机上运行WinDbg?我只在Windows 8机器上收到相同的错误信息。如果我将内存转储到文件中,即使我做了也不能运行SOS!wow64exts.sw切换到32位模式。但是,如果我重视过程,我可以执行SOS ... – 2013-05-09 12:44:35

我相信你将不得不使用位于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

+0

那么,没有办法使用当前的转储? – 2013-05-07 15:29:24

+0

上面链接中的一条评论提到运行!wow64exts.sw,它可以让你运行堆栈相关的命令,如!clrstack。我从来没有尝试过,因为我已经能够获得新的转储。 – trydis 2013-05-07 15:35:37

+0

我打算把这个开放一天左右,看看有没有人回答说我不是我,否则我会接受这一个 – 2013-05-07 18:13:23

我一直跟着位数匹配的建议,但从来不知道究竟为什么,直到我偶然发现这篇文章就来了: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位进程也是如此。请确保您的程序平台与您的 相匹配正在调试。“

还有一个选项适用于我: - 我有一个64位进程崩溃转储。因此,首先,我需要SOS.dll和mscordacwks.dll从机器(C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319)转储被采取。 ! - 基于两篇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位崩溃转储。

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

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

+0

我很确定这应该是现在的答案,但我可能有点偏颇;) – poizan42 2016-06-10 10:04:18

+0

@ poizan42非常感谢soswow64,它让我的工作变得如此简单! – 2016-06-24 14:43:29