使用调试程序

本页详细介绍了如何使用 LLDB 进行操作系统开发。对于应用开发,请参阅调试应用,其中介绍了如何使用 Android Studio GUI(基于 LLDB)。

我们不再支持或提供 GDB。如果您是从 GDB 改用 LLDB,应该先阅读 LLDB 教程。如果您是 GDB 专家用户,那么在过渡期间,GDB 到 LLDB 命令映射表会非常有用。

前提条件

如需使用调试程序,请执行以下操作:

  • 使用常规 envsetup.sh 命令设置构建环境。
  • 运行您在构建时使用的同一 lunch 命令。 请注意,lunch 项应与您正在调试的设备完全匹配。如果 lunch 项与连接的设备不匹配,您会收到以下形式的错误消息:You used the wrong lunch: TARGET_PRODUCT (aosp_arm64) does not match attached device (xyzabc)
  • 将设备连接到机器。

如需获得环境设置方面的更多帮助,请参阅设置环境

调试二进制文件

如需调试您在自己的机器上构建的二进制文件,必须先将该二进制文件复制到设备,然后再启动调试程序。例如:

adb push test.exe /data/local/tmp/test.exe
lldbclient.py --port 5038 -r /data/local/tmp/test.exe

调试运行中的应用或进程

如需连接到正在运行的应用或原生守护程序,请配合使用 lldbclient.py 和 PID。例如,如需调试 PID 为 1234 的进程,请在主机上运行以下命令:

lldbclient.py -p 1234

此脚本会设置端口转发,在设备上启动相应的远程调试桩,在主机上启动调试程序,配置该调试程序以查找符号,然后将该调试程序连接到远程调试桩。

调试启动的原生进程

如需在进程启动时对其进行调试,请使用 lldbclient.py-r 选项。例如,如需调试 ls /bin,请在主机上运行以下命令:

lldbclient.py -r /system/bin/ls /bin

然后,在调试程序的提示符处输入 continue

调试启动的应用

有时,您需要在应用启动时对其进行调试;例如在应用发生崩溃时,您需要逐步检查代码,以查看崩溃之前发生的情况。附加调试程序有时能解决问题,但有时不能,因为应用有可能在你还没来得及附加调试程序时已经崩溃。logwrapper 方法(用于 strace)不一定能解决所有的问题,因为应用可能没有权限打开端口,而 lldbserver 会继承这项限制。

如需调试应用启动,请使用“设置”中的开发者选项来指示应用等待附加 Java 调试程序:

  1. 依次转到设置 > 开发者选项 > 选择调试应用,并从列表中选择您的应用,然后点击等待调试程序
  2. 启动应用。您可以从启动器启动,也可以在命令行中运行以下命令来启动:
    adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY
    
  3. 等待应用加载,然后会出现一个对话框,它会提示您应用正在等待附加调试程序。
  4. 正常附加 lldbserver/lldbclient,设置断点,然后继续运行进程。

为了让应用运行,请附加 Java 调试网络协议 (JDWP) 调试程序,例如 Java 调试程序 (jdb):

adb forward tcp:12345 jdwp:XXX  # (Where XXX is the PID
of the debugged process.)
jdb -attach localhost:12345

调试崩溃的应用或进程

如果您希望 debuggerd 挂起崩溃的进程,以便您可以附加调试程序,请设置相应的属性:

  • Android 11 之后的版本
    adb shell setprop debug.debuggerd.wait_for_debugger true
    
  • Android 11 及更低版本
    adb shell setprop debug.debuggerd.wait_for_gdb true
    
  • Android 6.0 Marshmallow 及更低版本
    adb shell setprop debug.db.uid 999999
    

在惯常的崩溃输出结尾处,debuggerd 将在 logcat 中提供复制和粘贴说明,说明如何将调试程序连接到崩溃进程。

使用 VS Code 进行调试

LLDB 支持在 Visual Studio Code 上调试平台代码。您可以使用 VS Code 调试程序前端(而非 LLDB CLI 接口)来控制和调试在设备上运行的原生代码。

在使用 VS Code 进行调试之前,请安装 CodeLLDB 扩展程序

使用 VS Code 调试代码的步骤:

  1. 确保运行 lldbclient.pylldbclient.py 所需的所有构建工件(例如符号)都存在。
  2. 在 VS Code 中,按 Ctrl + Shift + P 运行命令,搜索 Debug: Add Configuration…,然后选择 LLDB。这将打开一个 launch.json 文件,并将新的 JSON 对象添加到列表中。
  3. 将新添加的调试程序配置替换为两个注释行(// #lldbclient-generated-begin// #lldbclient-generated-end),让您的配置列表如下所示:
    "configurations": [
        // #lldbclient-generated-begin
        // #lldbclient-generated-end
    ]

    lldbclient.py 使用这些注释来检测在哪里写入配置。如果列表中还有其他项,请将注释行添加到末尾(在其他配置之后)。

  4. 在您运行 envsetup.shlunch 的终端中运行以下命令:
    lldbclient.py --setup-forwarding vscode-lldb \
          --vscode-launch-file LAUNCH_JSON_PATH \
          ANY_OTHER_FLAGS -p pid | -n proc-name | -r ...

    lldbclient.py 会将生成的配置写入 launch.json 并继续运行。这是预期结果;请不要终止 lldbclient.py 程序。如果省略 --vscode-launch-file,脚本将输出 JSON 代码段,您需要将其手动复制并粘贴到 launch.json 中。

    根据工具解析标记的方式,-r 标记必须是最后一个标记(如果存在)。

  5. 打开 Run and Debug 边栏,新配置应显示在调试程序列表中。按 Start Debugging (F5)。调试程序应在 10 到 30 秒后连接。

    如果新配置未出现在“Run and Debug”视图中,请重新加载窗口以刷新调试程序列表:按 Ctrl + Shift + P 并输入 reload window

  6. 完成调试后,请前往运行 lldbclient.py 的终端,然后按 Enter 结束 lldbclient.py 程序。后续运行该脚本时,系统会在 #lldbclient-generated 注释之间生成配置并替换旧内容,您无需手动将旧内容移除。

如需向生成的启动配置添加自定义属性,您可以使用 --vscode-launch-props 标志。例如:

lldbclient.py --setup-forwarding vscode-lldb \
    --vscode-launch-props \
    '{"initCommands" : ["script print(\"Hello\")"], "preLaunchTask" : "Build"}' \
    ...
示例属性会使 VS Code 在调试之前运行名为 Build 的任务,并将新的调试初始化步骤附加到脚本生成的步骤。您可以在 VS Code 文档CodeLLDB 扩展程序的用户手册中找到可用属性概览。