我正在尝试使用 Windbg 研究在 x64 计算机上为我们的 x86 进程创建的挂起转储文件。这是一个 4.0 x86 应用程序,因此为了获得非托管堆栈,我必须执行以下操作:
.loadby sos clr
.load wow64exts
!sw
kL
但是,每次我尝试通过
!clrstack
获取托管堆栈时,我都会收到标题中的错误。我错过了什么?
我相信您必须使用位于 C:\Windows\SysWOW64 askmgr.exe 的 32 位任务管理器来获取 32 位转储。
正如其他人已经说过的,这可能是由 64 位应用程序(例如默认任务管理器)创建 32 位进程的转储文件引起的。
我能够使用 GitHub 上poizan42 的 soswow64 WinDbg 扩展解决该问题。我通过此博客条目找到了它,其中还提供了有关该问题的一些更详细的信息。
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 位进程。确保您的程序的平台匹配 您正在调试。”
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 位故障转储。
!分析-v
.cordll
.effmach
!clrstack
0:000> .loadby sos clr
调用LoadLibrary(C:\Windows\Microsoft.NET\Framework 4.0.30319\sos.dll)失败,Win32错误0n193
“%1 不是有效的 Win32 应用程序。”
请检查您的调试器配置和/或网络访问。
错误:无法加载扩展 C:\Windows\Microsoft.NET\Framework 4.0.30319\sos.dll
mkdir c:\procdumps
cd C:\Program Files (x86)\Windows Kits\10\Debuggers\x86
adplus.exe -hang -pn MyApp.exe -o c:\procdumps\ -quiet