SOS 不支持当前目标架构
Posted
技术标签:
【中文标题】SOS 不支持当前目标架构【英文标题】:SOS does not support the current target architecture 【发布时间】:2013-05-01 14:45:51 【问题描述】:我正在尝试使用 windbg 研究在 x64 机器上为我们的 x86 进程创建的挂起转储文件。这是一个 4.0 x86 应用程序,所以为了获得非托管堆栈,我必须执行以下操作:
.loadby sos clr
.load wow64exts
!sw
kL
但是,每次我尝试通过 !clrstack
获取托管堆栈时,我都会在标题中看到错误。我错过了什么?
【问题讨论】:
您是否在 Windows 8 机器上运行 WinDbg?我只在 Windows 8 机器上收到相同的错误消息。如果我将内存转储到文件中,即使我执行 !wow64exts.sw 切换到 32 位模式,我也无法运行 SOS。但是,如果我附加到进程,我可以执行 SOS... 【参考方案1】:我相信您必须使用位于 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
【讨论】:
那么,有没有办法使用当前的转储? 上面链接中的一条评论提到运行 !wow64exts.sw,它可以让您运行堆栈相关的命令,例如 !clrstack。我自己从来没有尝试过,因为我已经能够获取一个新的转储。 我将把这个打开一天左右,看看是否有人有一个不是我的答案,否则我会接受这个 @BenG: web.archive.org/web/20160205021908/https://…【参考方案2】:正如其他人已经说过的,这可能是由 64 位应用程序(例如默认的任务管理器)创建 32 位进程的转储文件引起的。
我能够使用来自poizan42 on GitHub 的soswow64 WinDbg 扩展解决这个问题。我是通过this blog entry找到的,它还提供了有关该问题的一些更详细的信息。
【讨论】:
我很确定这应该是现在的答案,但我可能有点偏颇;) @poizan42 非常感谢 soswow64,它让我的工作轻松多了! @poizan42:这是一个很棒的工具,应该引起更多关注。它也适用于最新平台 SDK 的 10.0.17713.1000 的 Windbg。干得好!【参考方案3】:我一直遵循位数匹配的建议,但直到我看到这篇文章才知道确切原因: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 位进程。确保您的程序平台与 你正在调试。”
【讨论】:
【参考方案4】:还有一个对我有用的选项: - 我有一个 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 位故障转储。
【讨论】:
以上是关于SOS 不支持当前目标架构的主要内容,如果未能解决你的问题,请参考以下文章
当前的 .Net SDK 不支持针对 .Net Core 2.2 目标 .Net Core 2.1 或更低版本 [重复]
使用 Blazor Asp.NetCore 托管模板时获取“NETSDK1045 当前的 .NET SDK 不支持 .NET Core 3.0 作为目标”