在 64 位机器上捕获的 32 位进程的调试转储

Posted

技术标签:

【中文标题】在 64 位机器上捕获的 32 位进程的调试转储【英文标题】:Debugging dump of 32-bit process captured on 64-bit machine 【发布时间】:2011-04-29 08:42:30 【问题描述】:

我最近收到了一位客户的 64 位故障转储。 我们的进程都是 32 位的,但客户的机器运行的是 x64 Server 2008。

Visual Studio(2008 和 2010 Express)告诉我必须使用 64 位版本的 MSVSMON.EXE,但我不能,因为我没有 64 位机器。

我很确定在 WinDbg 中有一种方法可以做到这一点,但我发现 WinDbg 是敌对的。

有什么方法可以在 32 位机器上调试 64 位转储,最好使用 Visual Studio?

【问题讨论】:

这不再是问题from VS 2013 on。 已将link 更新为上一条评论中的资源。 【参考方案1】:

您需要确保客户使用 32 位工具(adplus 或 DebugDiag)来为您的 32 位进程捕获故障转储。然后你可以使用你的 32 位机器来调试转储。

http://blogs.msdn.com/b/tess/archive/2010/09/29/capturing-memory-dumps-for-32-bit-processes-on-an-x64-machine.aspx

虽然 Isalamon 的评论在技术上是正确的,但没有人愿意执行它,因为堆栈跟踪太可怕了。

让您的客户知道这是必要的,并希望他/她合作。

如果您不熟悉转储分析,Microsoft 随时为您服务,http://support.microsoft.com

【讨论】:

我使用了 ProcDump,如链接的博客文章中所述。即使在 VS2010 中使用托管代码,也能像魅力一样工作。【参考方案2】:

我通过使用 32 位任务管理器 (C:\Windows\SysWOW64\Taskmgr.exe) 捕获转储来解决此问题。

【讨论】:

【参考方案3】:

按照此处的建议,使用 !wow64exts.sw 切换到 x86 模式的建议,我得到了很好的结果:

http://blogs.msdn.com/b/ntdebugging/archive/2008/06/03/how-to-debug-wow64-applications.aspx

这里的建议数字相同:

http://blogs.msdn.com/b/msdnforum/archive/2010/03/14/how-do-i-switch-to-32bit-mode-when-i-use-windbg-to-debug-a-dump-of-a-32bit-application-running-on-an-x64-machine.aspx

这里还有后台和相关命令:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa384163(v=vs.85).aspx

希望除了此线程中已经存在的内容之外,这还可以作为有关该主题的体面输入的汇编。谢谢。

【讨论】:

非常有用,谢谢。在 64 位 Windows 任务管理器上获取 32 位进程的 dmp,这有助于在 windbg 中切换模式以进行诊断【参考方案4】:

是用户转储还是内核转储?看起来你得到了系统转储。如果是这种情况,那么您可以在 windbg 上使用 !wow64exts 扩展来帮助解决问题。

【讨论】:

【参考方案5】:

我同意你应该正确捕获 dmp 文件,但最近对这种错误捕获的 dmp 文件进行了一些实验。我使用 WinDbg 修补 SOS.dll 以删除拱形检查。我不能 100% 确定我得到的内容是否有效,但至少有一些看起来是这样的……https://chentiangemalc.wordpress.com/2015/04/17/experimental-use-of-64-bit-dump-of-32-bit-net-process-in-windbg/

【讨论】:

以上是关于在 64 位机器上捕获的 32 位进程的调试转储的主要内容,如果未能解决你的问题,请参考以下文章

process explorer 如何生成转储(dmp)文件

x64 上的 x86 远程调试器服务

高 CPU 使用率的 32 位进程的 Process Dump 分析

Win32 32 位进程加载 64 位 kernel32.dll

如何使 .NET 可执行文件在 64 位操作系统上作为 32 位进程运行?

如何从 32 位进程启动 64 位进程