调试平台代码

Android Studio for Platform (ASfP) 提供了一个强大的调试程序,可让您:

  • 选择要调试的设备。
  • 在 Java、Kotlin、C/C++ 和 Rust 代码中设置断点。
  • 在运行时检查变量和对表达式求值。

在使用调试器之前,您必须将 build 刷写到设备或模拟器。

应用进程 (Java/Kotlin) 调试

如需调试 Java 或 Kotlin 应用进程,请执行以下操作:

  1. 在 ASfP 中设置 Java 或 Kotlin 代码中的断点。

  2. 从菜单中依次选择 Run > Attach Debugger to Android Process

  3. Choose Process 对话框中,确保将调试类型设置为 Java Only

  4. 从列表中选择您的设备。

  5. 选择要调试的特定应用进程。

  6. 点击确定

  7. 与设备上的应用互动,以触发断点。

系统进程 (C/C++) 调试

如需调试使用 C 或 C++ 编写的系统进程,请执行以下操作:

  1. 验证您是否只运行了一个设备或模拟器。

  2. 打开终端,然后从 AOSP 代码库根目录运行 adb rootbash adb root

  1. 在 ASfP 中设置 C/C++ 代码断点。

  2. 从菜单中依次选择 Run > Attach Debugger to Android Process

  3. Choose Process 对话框中,将调试类型更改为 Native OnlyDual (Java + Native)

  4. 勾选 Show all processes 复选框以查看系统进程。

  5. 从列表中选择您的设备。

  6. 选择要调试的特定系统进程(例如 surfaceflingersystem_server)。

  7. 点击确定

  8. 与设备互动以命中您的断点。

Rust 调试

ASfP 支持使用 LLDB 通过调试适配器协议 (DAP) 进行 Rust 调试。 本部分概述了如何将 CodeLLDB 设置为调试适配器服务器,以及如何在主机和 Android 设备上调试 Rust 代码。

将 CodeLLDB 设置为调试适配器服务器

  1. 创建新的 Debug Adapter Protocol 运行/调试配置:

    1. 从菜单中依次选择 Run > Edit Configurations
    2. 点击 + 按钮。
    3. 选择 Debug Adapter Protocol
  2. 在服务器标签页中,点击创建新服务器

  3. 在新打开的对话框中,点击 Choose template,然后从列表中选择 CodeLLDB

  4. 选择 CodeLLDB 模板后,系统会添加具有预定义配置的新服务器。

    1. 轨迹下拉菜单中选择详细,以启用详细轨迹记录。
    2. 添加一个环境变量,用于指定 Android 源代码预构建中的 lldb-server 的路径:
        LLDB_DEBUGSERVER_PATH=REPO_ROOT/prebuilts/clang/host/linux-x86/CLANG_VERSION/runtimes_ndk_cxx/x86_64/lldb-server
        ```
    
    Replace `REPO_ROOT` with the absolute path to your Android source checkout.
    To find `CLANG_VERSION`, run the `get_clang_version.py` script from the root of
    your Android source tree:
    
    ```bash
        ./build/soong/scripts/get_clang_version.py
    
    1. 请勿更改 <<insert base directory>> 部分。

在主机上调试 Rust 二进制文件

  1. 在调试适配器协议运行/调试配置中,打开配置标签页。
  2. 选择启动作为调试模式
  3. 更新工作目录,然后选择要调试的二进制文件
  4. 点击确定以保存配置。
  5. 点击配置旁边的调试图标,启动调试会话。

首次运行此命令时,CodeLLDB 会下载。您应该会在控制台中看到 DAP 轨迹。在 Rust 代码中设置的断点应按预期命中。

在 Android 设备上调试 Rust 二进制文件(附加模式)

  1. 查找 PID:在 Android 设备上找到要调试的应用的进程 ID (PID)。

  2. 在设备上启动 lldb-server:从 Android 源代码树检出的根目录运行 lldbclient.py 脚本,并将 <PID> 替换为进程 ID:

    lldbclient.py --setup-forwarding vscode-lldb -p <PID>
    

    此脚本会将正确的 lldb-server 推送到设备,启动该 lldb-server,设置端口转发(主机端口 5039 到设备),并输出后续步骤所需的 DAP JSON 配置。保持此终端处于打开状态。

  3. 在主机上启动 CodeLLDB 调试适配器

    • 前往 CodeLLDB 扩展程序目录(默认:~/.lsp4ij/dap/codelldb/extension/adapter)。
    • 设置所需的环境变量并启动适配器服务器,注意将 REPO_ROOTCLANG_VERSION 替换为在服务器设置中确定的值:
        # Sets PYTHONHOME env variable
        export PYTHONHOME=REPO_ROOT/prebuilts/clang/host/linux-x86/CLANG_VERSION/python3
    
        # Tell the dynamic linker where to find python libs
        export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:REPO_ROOT/prebuilts/clang/host/linux-x86/CLANG_VERSION/python3/lib
    
        # Starts the CodeLLDB Debugger Adapter server on port 1234
        ./codelldb --liblldb REPO_ROOT/prebuilts/clang/host/linux-x86/CLANG_VERSION/lib/liblldb.so --port 1234
    
  4. 配置 ASfP DAP 客户端

    1. 返回 ASfP 中的调试适配器协议运行/调试配置。
    2. 选择配置标签页。
    3. 调试模式设置为附加
    4. 地址设置为 localhost
    5. 端口设置为 1234
    6. lldbclient.py 命令(第 2 步)的 JSON 输出粘贴到 DAP parameters (JSON) 字段中。
  5. 点击 Debug 以启动调试会话。

问题排查

  • 如果您看到错误 error: Connection shut down by remote side while waiting for reply to initial handshake packet,请终止当前调试会话,然后重新启动设备上的 lldb-server 和主机上的 CodeLLDB 适配器。