NDK 包含一个名为 ndk-gdb
的 shell 脚本,用于启动命令行本机调试会话。喜欢使用 GUI 的用户应该改为阅读 Android Studio 中的调试 文档。
要求
要使命令行本机调试正常工作,必须满足以下要求
- 使用
ndk-build
脚本构建您的应用程序。ndk-gdb
脚本不支持使用旧的make APP=<name>
方法进行构建。 - 在您的
AndroidManifest.xml
文件中,通过包含一个将android:debuggable
属性设置为true
的<application>
元素来启用应用程序调试。 - 构建您的应用程序以在 Android 2.2(Android API 级别 8)或更高版本上运行。
- 在运行 Android 2.2 或更高版本的设备或模拟器上进行调试。出于调试目的,您在
AndroidManifest.xml
文件中声明的目标 API 级别无关紧要。 - 在 Unix shell 中开发您的应用程序。在 Windows 上,使用 Cygwin 或实验性的
ndk-gdb-py
Python 实现。 - 使用 GNU Make 3.81 或更高版本。
用法
要调用 ndk-gdb
脚本,请更改到应用程序目录或其下的任何目录。例如
cd $PROJECT $NDK/ndk-gdb
这里, $PROJECT
指向您的项目的根目录,而 $NDK
指向您的 NDK 安装路径。
当您调用 ndk-gdb
时,它会配置会话以查找您的源文件以及生成的本机库的符号/调试版本。成功连接到您的应用程序进程后, ndk-gdb
会输出一系列很长的错误消息,指出它找不到各种系统库。这是正常的,因为您的主机上没有目标设备上这些库的符号/调试版本。您可以安全地忽略这些消息。
接下来, ndk-gdb
会显示一个正常的 GDB 提示符。
您可以与 ndk-gdb
的交互方式与使用 GNU GDB 的方式相同。例如,您可以使用 b <location>
设置断点,并使用 c
(表示“继续”)恢复执行。有关命令的完整列表,请参阅 GDB 手册。 如果你喜欢使用 LLDB 调试器,在调用 ndk-gdb
脚本时使用 --lldb
选项。
请注意,当您退出 GDB 提示符时,您正在调试的应用程序进程将停止。此行为是 gdb 的限制。
ndk-gdb
处理许多错误情况,并在发现问题时显示一条信息丰富的错误消息。这些检查包括确保满足以下条件
- 检查 ADB 是否在您的路径中。
- 检查您的应用程序在其清单中是否被声明为可调试的。
- 检查设备上安装的具有相同包名的应用程序是否也是可调试的。
默认情况下, ndk-gdb
会搜索正在运行的应用程序进程,并且如果找不到,则会显示错误消息。但是,您可以使用 --start
或 --launch=<name>
选项在调试会话之前自动启动您的活动。有关更多信息,请参阅 选项。
选项
要查看选项的完整列表,请在命令行中键入 ndk-gdb --help
。表 1 显示了一些更常用的选项以及简要说明。
使用此选项启动 ndk-gdb
会启动应用程序清单中列出的第一个可启动活动。使用 --launch=<name>
启动下一个可启动活动。要转储可启动活动的列表,请从命令行运行 --launch-list
。
选项 | 描述> |
---|---|
--lldb |
如果设置,脚本将使用 LLDB 调试器进行会话,而不是 gdb。 |
--verbose |
此选项告诉构建系统打印有关本机调试会话设置的详细消息。只有在调试器无法连接到应用程序时,并且 |
--force |
默认情况下,如果 ndk-gdb 发现同一设备上已运行另一个本机调试会话,它将中止。此选项会杀死另一个会话,并用新的会话替换它。请注意,此选项不会杀死正在调试的实际应用程序,您必须单独杀死它。 |
--start |
当您启动 |
--launch=<name> |
此选项类似于 |
--launch-list |
此便利选项打印在您的应用程序清单中找到的所有可启动活动名称的列表。 |
--project=<path> |
此选项指定应用程序项目目录。如果您想在不先切换到项目目录的情况下启动脚本,此选项很有用。 |
--port=<port> |
默认情况下, |
--adb=<file> |
此选项指定 adb 工具可执行文件。只有在您没有将路径设置为包含该可执行文件时,才需要此选项。 |
-d -e -s <serial> |
这些标志类似于具有相同名称的 adb 命令。如果您有多个设备或模拟器连接到您的主机计算机,请设置这些标志。它们的含义如下
或者,您可以定义 |
--exec=<file> -x <file> |
此选项告诉 |
--nowait |
禁用暂停 Java 代码,直到 GDB 连接。传递此选项可能会导致调试器错过早期的断点。 |
--tui -t |
如果可用,则启用文本用户界面。 |
--gnumake-flag=<flag> |
此选项是在查询项目信息时传递给 |
注意: 表中最后三个选项仅适用于 Python 版本的 ndk-gdb
。
线程支持
如果您的应用程序运行在低于 Android 2.3(API 级别 9)的平台上,ndk-gdb
无法正确调试本机线程。调试器只能调试主线程,并且完全忽略其他线程的执行。
如果您在非主线程上执行的函数上设置断点,程序将退出,并且 GDB 将显示以下消息
Program terminated with signal SIGTRAP, Trace/breakpoint trap. The program no longer exists.