Android NDK开发详解之ndk-gdb

Android NDK开发详解之ndk-gdb

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

其中, P R O J E C T 指向您项目的根目录, PROJECT 指向您项目的根目录, PROJECT指向您项目的根目录,NDK 指向 NDK 安装路径。

调用 ndk-gdb 时,它会配置此会话以查找您的源文件以及所生成的原生库的符号/调试版本。成功附加到您的应用进程后,ndk-gdb 会输出一长串错误消息,表示无法找到各种系统库。这很正常,因为您的主机并未在目标设备上包含这些库的符号/调试版本。您可以放心地忽略这些消息。

接下来,ndk-gdb 会显示一个正常的 GDB 提示。

您可能熟悉与 GNU GDB 的互动方式,与 ndk-gdb 的互动方式与之相同。例如,您可以使用 b 设置断点,并使用 c(表示"continue")继续执行。有关完整的命令列表,请参阅 GDB 手册。如果您更喜欢使用 LLDB 调试程序,请在调用 ndk-gdb 脚本时使用 --lldb 选项。

请注意,如果您退出 GDB 提示,那么您正在调试的应用进程将停止。此行为是一种 gdb 限制。

ndk-gdb 可处理许多错误情况,并会在发现问题时显示可提供有用信息的错误消息。这些检查包括确保满足以下条件:

复制代码
    确保 ADB 位于您的路径中。
    确保您的应用已在其清单中声明为可调试。
    确保设备上安装的具有相同软件包名称的应用同样可调试。

默认情况下,ndk-gdb 会搜索已在运行的应用进程;如果没有搜索到,则会显示相应的错误。不过,您可以使用 --start 或 --launch= 选项在调试会话前自动启动您的 Activity。有关详情,请参阅选项。

选项

要查看完整的选项列表,请在命令行中输入 ndk-gdb --help。表 1 显示了许多比较常用的选项及其简要说明。

表 1. 常用 ndk-gdb 选项及其说明。

在指定了此选项的情况下启动 ndk-gdb,将会启动应用清单中列出的第一个可启动 Activity。使用 --launch= 可启动下一个可启动的 Activity。要转储可启动 Activity 的列表,请从命令行运行 --launch-list。

线程支持

如果运行应用的平台版本低于 Android 2.3(API 级别 9),ndk-gdb 就无法正确调试原生线程。调试程序只能调试主线程,abd 会完全忽略其他线程的执行。

如果您在非主线程上执行的函数上放置一个断点,则程序将退出,而 GDB 将显示以下消息:

Program terminated with signal SIGTRAP, Trace/breakpoint trap.

The program no longer exists.

相关推荐
wangbing11255 小时前
springboot应用关闭时触发动作
java·spring boot·后端
weixin_460443568 小时前
2026年新修订《网络安全法》实施:Java私有化考试系统如何做好SBOM、漏洞治理与安全升级?
java·开发语言·在线考试系统·企业培训考试系统·宏远培训考试系统·国企培训考试系统·国产化培训系统
海鸥-w11 小时前
什么是AOP
java
Cc.Y12 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
启观川12 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法
paopaokaka_luck12 小时前
基于springboot+vue的智慧家政管理系统(AI问答、 WebSocket实时沟通、ECharts运营分析、订单规则与服务追踪)
java·javascript·spring boot·数据分析·echarts·mybatis
sm_9267870512 小时前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
阿森_dev12 小时前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计
by2099912 小时前
C++ 多态:同一个基类接口,调用不同的函数
开发语言·c++·经验分享·多态
Sarvartha12 小时前
Lambda 表达式和函数式接口
java·开发语言