调试平台代码

Android Studio for Platform (ASfP) 在调试工具窗口的附加标签页中集成了多语言平台调试功能:

  • 选择 Run > Attach to Android Process (Control+Alt+A),将 Java 调试程序、原生调试程序(捆绑的 LLDB)或两者同时附加到实体设备或 Cuttlefish 虚拟设备上任何正在运行的应用或系统进程。
  • 在附加之前,检查每个已加载的共享库 (.so) 及其在 Libraries 面板中的八字符 ELF Build ID,并使用对勾标记 图标验证 out/target/product/<device>/symbols 下的本地调试符号是否匹配。
  • 从工具栏管理设备前提条件:使用显示系统进程进行过滤,点击 Root 设备以运行 adb root(激活时显示设备已 root),然后点击启用 JDWP 以在 userdebug build 上启用 JDWP。
  • 设置条件断点和异常断点,在编辑器中查看内嵌变量值,使用丢弃帧和智能步入,并在运行时检查结构化 C++ 和 Rust 类型。

在使用调试器之前,请构建 lunch 目标,以便本地存在 out/target/product/<device>/symbols/.build-id 符号索引,并刷写或启动匹配的设备映像。

Java 和双重 Java 与原生调试

如需调试 Java 或 Kotlin 应用、系统应用(例如 com.android.messaging、设置或 SystemUI)或调用 JNI 和 C++ 或 Rust 代码的进程,请完成以下步骤:

  1. 在 Java、Kotlin、C、C++ 或 Rust 源文件中设置断点。
  2. 依次选择 Run > Attach to Android Process (Ctrl+Alt+A)。ASfP 会在 Debug 工具窗口中打开固定的 Attach 标签页。
  3. 从设备下拉菜单中选择目标设备。如果 userdebug build 上未启用 JDWP,请点击 Enable JDWP(启用 JDWP)- ASfP 会设置 persist.debug.dalvik.vm.jdwp.enabled=1 并重新启动设备。处于有效状态时,该按钮会显示 JDWP 已启用,右键点击该按钮会显示停用 JDWP 操作。
  4. 从表格中选择目标进程(Java 和 ART 进程会显示咖啡杯图标)。
  5. 在附加标签页底部,选择 Java 调试器、原生调试器或同时选择这两者。如果同时选择这两个选项,Debug 工具窗口中会打开两个关联的标签页:<process> (<pid>) 用于内置 LLDB,<process> (<pid>)-jdwp 用于 Java。它们的生命周期是绑定的,因此停止任一会话都会停止这两个会话。
  6. 点击 Attach,然后与设备上的应用互动,以触发断点。

与“附加”标签页并排显示的 Java 和原生双重调试标签页

系统进程(C 和 C++)调试和符号验证

如需调试系统守护程序、HAL 或系统服务(例如 android.hardware.bluetooth-service.cuttlefish、surfaceflinger 或 audioserver),请完成以下步骤:

  1. 打开 Run > Attach to Android Process(Ctrl+Alt+A)。如果工具栏显示 Root Device,请点击它,以便 ASfP 运行 adb root 并显示 Device is rooted。
  2. 在顶部工具栏中选择显示系统进程,然后过滤出目标进程。
  3. 在“库”面板中验证本地调试符号:选择某个进程后,库表格会填充该进程中加载的每个 ELF 共享库 (.so) 及其 ELF build ID 的前八个十六进制字符。ASfP 会将每个 build ID 与 out/target/product/<device>/symbols 进行匹配(需要 symbols/.build-id 来解析 APEX 中的库):
    • 经过验证的库会显示对勾图标。指向任何已解析的行,即可预览其完整的本地 .debug 符号路径。
    • 没有匹配本地符号的未解析库会显示警告图标。
  4. 非 Java 进程检测:当您选择 C++ 或 Rust 进程(带有六边形 C 图标)时,ASfP 会隐藏 Java 调试器,并显示 Java 调试不可用,不是 Java 进程。同时保持选中 Native 调试器。
  5. 在 C、C++ 或 Rust 源文件中设置断点,点击 Attach,然后在设备上触发代码路径。

显示“库”表格、“ELF build ID”和本地符号对勾标记的附加标签页

调试 Rust 代码

ASfP 使用与 C 和 C++ 相同的内置 LLDB 调试器来调试 Rust 平台代码。无需外部适配器或手动服务器设置:ASfP 使用其捆绑的工具链中的 lldb-dap,并自动从 AOSP 预建版本加载 Rust 格式化打印机,以便 String、Vec、HashMap 和 Option 等标准类型在变量窗格中显示结构化值。

附加到设备上正在运行的 Rust 进程

按照系统进程(C 和 C++)调试中的步骤操作:打开 Run > Attach to Android Process,验证设备已启用 root 权限,本地符号在 Libraries 面板中显示为对勾标记,保持选中原生调试程序,然后点击 Attach。Rust 和 C 或 C++ 堆栈帧在同一调试会话中一起显示。

调试 rust_test 或 rust_test_host 模块

  1. 打开声明 rust_test 或 rust_test_host 目标的 Android.bp 文件,然后点击模块类型旁边的边衬区中的运行图标。
  2. 选择 Debug '<ModuleName>'。ASfP 会构建目标,在主机或已连接的设备上通过 LLDB 启动测试二进制文件,并在 Rust 断点处暂停。
  3. 如需调试单个测试函数或自定义 LLDB 启动命令,请依次打开 Run > Edit Configurations,选择生成的 Soong Test 配置,然后设置 Method 或展开 Debugger 选项。如需详细了解 Soong 测试配置选项,请参阅使用 atest 测试平台代码。

在 ASfP 中使用结构化变量可视化工具调试 Rust 平台代码