我正在尝试使用windbg来研究在x64机器上为x86进程创建的挂起转储文件。这是一个4.0 x86的应用程序,所以为了获得一个非托管堆栈,我必须执行以下操作:
.loadby sos clr
.load wow64exts
!sw
kL
但是,每当我尝试通过!clrstack
获取托管堆栈时,我都会在标题中看到错误。我错过了什么?
答案 0 :(得分:24)
我相信您必须使用位于C:\ Windows \ SysWOW64 \ taskmgr.exe中的32位任务管理器才能获得32位转储。
答案 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.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>
在此之后,!线程工作。我认为,同样适用于32位崩溃转储。