使用调试程序

使用调试程序

https://source.android.google.cn/docs/core/tests/debug/gdb?hl=zh-cn

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

GDB 已弃用,很快就会被移除。如果您是从 GDB 改用 LLDB,应该先阅读 LLDB 教程。如果您是 GDB 专家用户,那么在过渡期间,GDB 到 LLDB 命令映射表会非常有用。

前提条件


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

  • 使用常规 envsetup.sh 命令设置构建环境。

  • 运行您在构建时使用的同一 lunch 命令。

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

调试运行中的应用或进程


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

gdbclient.py -p 1234

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

注意:在 Android 6 及更低版本的系统中,该脚本是一个名为 gdbclient 的 Shell 脚本,而不是名为 gdbclient.py 的 Python 脚本。

调试原生进程启动


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

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

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

调试应用启动


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

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

  1. 依次转到设置 > 开发者选项 > 选择调试应用,并从列表中选择您的应用,然后点击等待调试程序

启动应用。您可以从启动器启动,也可以在命令行中运行以下命令来启动:

adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY

  1. 等待应用加载,然后会出现一个对话框,它会提示您应用正在等待附加调试程序。

  1. 正常附加 gdbserver/gdbclient,设置断点,然后继续运行进程。

为了让应用运行,请附加 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 中提供复制和粘贴说明,说明如何将调试程序连接到崩溃进程。

无符号调试


对于 32 位 ARM,如果您的指令中没有符号,gdb 就不清楚自己正在反汇编哪个指令集(ARM 还是 Thumb)。如需指定缺少符号信息时选用的默认指令集,请设置以下属性:

set arm fallback-mode arm # or thumb

使用 VS Code 进行调试


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

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

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

  1. 确保运行 gdbclient.py 或 lldbclient.py 所需的所有构建工件(例如符号)都存在。

运行以下命令:

lldbclient.py --setup-forwarding      vscode-lldb ANY_OTHER_FLAGS -p pid | -n proc-name | -r ...

这将输出一个 JSON 对象,并且 lldbclient.py 将继续运行。 这是预期结果;请不要终止 lldbclient.py 程序。

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

注意:GDB 已废弃,应尽可能使用 LLDB。如果需要使用 GDB,请安装 C/C++ 扩展程序并将 --no-lldb 标志添加到 gdbclient.py。GDB 和 LLDB 之间的所有其他用法都相同。

  1. 在 VS Code 的“调试”标签页中,选择添加配置,然后选择 LLDB:自定义启动。这将打开一个 launch.json 文件,并将新的 JSON 对象添加到列表中。

  1. 删除新添加的调试程序配置。

  1. 复制 lldbclient.py 输出的 JSON 对象并将其粘贴到您刚删除的对象中。保存更改。

  1. 如需重新加载窗口以刷新调试程序列表,请按 Ctrl+Shift+P 并输入 reload window。

  1. 选择新的调试程序配置,然后按运行。调试程序应在 10 到 30 秒后连接。

  1. 完成调试后,请转到运行 lldbclient.py 的终端,然后按 Enter 结束 lldbclient.py 程序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值