【问题标题】:Determine if process dump was generated on x64 or x86 machine确定是否在 x64 或 x86 机器上生成了进程转储
【发布时间】:2011-11-10 18:34:33
【问题描述】:

如果我有一个进程转储文件,是否知道转储是在 x64 机器还是 x86 机器上生成的?

【问题讨论】:

标签: windbg crash-dumps sos


【解决方案1】:

您可以查看环境变量。命令!peb 的输出包括环境变量列表。如果您看到变量 PROCESSOR_ARCHITEW6432ProgramW6432 已定义,则操作系统为 64 位。否则,它是 32 位的。

【讨论】:

  • 当我运行 !peb 命令时,它给了我 PEB NULL...知道这是什么意思吗?
  • 表示转储不包含进程环境块(PEB)。当您在调试器中使用.dump /mp' or .dump /ma` 或.dump /mf 命令或使用ADPlus (support.microsoft.com/kb/q286350) 时,会添加PEB。
【解决方案2】:

不幸的是,以上答案在大多数情况下都不起作用。

如果目标进程构建为 x86 二进制文件,Dupmchk.exe 将对 x86 和 x64 操作系统显示“x86 兼容”。而且 !peb 命令还为我们大部分时间使用的小型转储提供了无用的“PEB NULL...”。

您最好检查“Kernel32.dll”的完整路径,因为 x64 操作系统将加载 “C:\Windows\Syswow64\Kernel32.dll” 而 x86 操作系统将加载普通的“C :\Windows\System32\Kernel32.dll" 用于 x86 可执行文件。加载的模块及其路径在 minidump 中重新记录,并且可以通过 dumpchk.exe、windbg 和 Visual Studio 轻松检查。

【讨论】:

  • 一些客户出于隐私原因希望删除路径,因此使用.dump /marR
  • 我也认为这是一个有效的策略。它在 Windows XP - Windows 7 上对我有用......但是,Windows 8 改变了一些东西并将 SysWOW64 路径仅转换为 System32。我觉得我的所有客户都在运行 32 位版本的 Windows 8+ 很奇怪...
【解决方案3】:

您可以使用 .effmach 命令了解创建转储的架构。请注意,在 WOW64 场景中,转储拱门是 x64,但您实际上应该使用 x86 方法对其进行调试(请参阅 !wow64exts.sw 命令)。

0:000> .effmach Effective machine: x64 (AMD64)

【讨论】:

  • .effmach 不能用于找出转储的位数。它只能用于找出用于调试的当前位数。在 64 位转储上尝试 !sw,然后尝试 .effmach,它将不再显示正确的结果。
  • 您是对的,但如果您在 WOW 转储上运行,那么在 !sw 命令之前 .effmach 命令将返回回答作者问题的正确位数。此外,如果您一直关注我们到现在,那么您肯定会知道转储的位数;)
【解决方案4】:

您可以使用 Windows 调试工具附带的 dumpchk.exe 实用程序。只需将转储文件作为参数传递。

在生成的报告中,您将拥有操作系统版本和 CPU 风格,例如:

Windows 7 版本 7601(Service Pack 1)免费升级版x64

产品:WinNt,套件:SingleUserTS

【讨论】:

  • 如果它显示 x64,那么它一定是在 x64 操作系统上拍摄的,但反之则不然。在 x64 系统上进行的 32 位转储将显示 x86。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
相关资源
最近更新 更多