在 Arm64 上进行调试

本文介绍在 ARM 处理器上调试Windows 10。 有关 Arm 上Windows 10的常规信息,请参阅 arm64 上的Windows 10桌面

通常,调试用户模式应用的开发人员应使用与目标应用的体系结构匹配的调试器版本。 使用 Arm64 版本的 WinDbg 调试用户模式 Arm64 应用程序,并使用 Arm 版本的 WinDbg 调试用户模式 ARM32 应用程序。 使用 x86 版本的 WinDbg 调试在 Arm64 处理器上运行的用户模式 x86 应用程序。

在需要调试系统代码(如 WOW64 或 CHPE)的极少数情况下,可以使用 Arm64 版本的 WinDbg。 如果要从另一台计算机调试 Arm64 内核,请使用与另一台计算机的体系结构匹配的 WinDbg 版本。

获取适用于 Windows 的 Arm 调试工具

可以通过下载 Windows SDK (版本 10.0.16299 或更高版本) 来获取适用于 Arm64 的调试工具。 在安装过程中,选择“ Windows 调试工具 ”框。

调试工具位于 Debuggers 工具包安装目录的 文件夹中。 x86 工具位于 下 Debuggers\x86,ARM32 工具位于 下 Debuggers\Arm,Arm64 工具位于 下 Debuggers\Arm64

调试 Arm64 代码

调试 Arm64 代码需要 Arm64 WinDbg。 调试体验类似于在 x86 Windows 上使用 x86 WinDbg 调试 x86 应用程序,但存在以下差异。

  • 有 32 个常规用途寄存器 - x0 到 x28 和 fp、lr、sp。
  • 程序计数器寄存器(pc)不是常规用途寄存器。
  • 所有常规用途寄存器和电脑寄存器的宽度均为 64 位。
  • 最多两个用于执行的活动数据断点和两个用于读/写内存的活动数据断点。 有关详细信息,请参阅 处理器断点

调试 x86 用户模式代码

在需要使用 Arm64 WinDbg 调试 x86 用户模式代码的极少数情况下,可以使用以下 WinDbg 命令在上下文之间切换:

  • .effmach x86:切换到 并查看 x86 上下文,模拟使用 x86 WinDbg 的效果。
  • .effmach arm64:切换到 并查看 Arm64 上下文
  • .effmach chpe:切换到 并查看 CHPE 上下文。

有关 .effmach 的详细信息,请参阅 .effmach (Effective Machine)

在用户模式下调试 x86 应用时,无论使用的是哪个 WinDbg 版本,请注意以下注意事项。

  • 如果线程未主动调试 (例如单步执行,遇到断点) ,未报告异常,也没有在系统调用中,则寄存器上下文可能不是最新的。
  • 模拟器在内部生成数据未对齐、非法指令、页内 I/O 错误异常,并处理生成的异常。 使用 WinDbg 时,请考虑将这些 异常配置为“ 调试/事件筛选器...” 菜单项来访问更新。
  • 如果在用户模式下使用 Arm64 WinDbg,则不支持跨 x86 & CHPE 函数边界的单步执行。 若要解决此问题,请在目标代码上设置断点。

有关 ARM64 和 WOW64 的一般信息,请参阅 64 位 Windows 编程指南中的 运行 32 位应用程序

有关调试 WOW64 下运行的应用程序的信息,请参阅 调试 WOW64

在 Visual Studio 中进行调试

有关在 Visual Studio 中调试 Arm 的信息,请参阅 远程调试

另请参阅