NDK 包含一个名为 ndk-gdb 的 Shell 脚本,可以启动命令行原生调试会话。偏好使用 GUI 的用户则应阅读在 Android Studio 中调试这篇文档。

要求

要运行命令行原生调试,必须满足以下要求:

使用 ndk-build 脚本构建您的应用。ndk-gdb 脚本不支持使用旧的 make APP= 方法进行构建。

在 AndroidManifest.xml 文件中添加可将 android:debuggable 属性设为 true 的 元素,从而在该文件中启用应用调试。

构建可在 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 提示。

您可能熟悉与 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。选项

说明>

--lldb

如果设置了此项,该脚本将对会话使用 LLDB 调试程序,而不是 gdb。

--verbose

此选项指示构建系统打印有关原生调试会话设置的详细信息。仅在调试程序无法连接到应用且 ndk-gdb 显示的错误消息不充分时,才需要用它解决调试问题。

--force

默认情况下,如果 ndk-gdb 发现同一设备上已有另一个原生调试会话在运行,它将会中止运行。此选项将终止另一个会话,并将其替换为新的会话。请注意,此选项不会终止正在被调试的实际应用,您必须另行终止它。

--start

当您启动 ndk-gdb 时,默认情况下,它会尝试附加到您的应用在目标设备上的现有运行实例。您可以替换此默认行为,只需在调试会话前使用 --start 在目标设备上明确启动应用即可。

--launch=

此选项类似于 --start,不过它允许您从应用中启动特定 Activity。仅当您的清单定义多个可启动 Activity 时,此功能才有用。

--launch-list

这个便捷选项会输出在您的应用清单中找到的所有可启动 Activity 名称的列表。--start 会使用第一个 Activity 名称。

--project=

此选项可指定应用项目目录。如果您希望不必先切换到项目目录就可启动脚本,则该选项会很有用。

--port=

默认情况下,ndk-gdb 会使用本地 TCP 端口 5039 与它在目标设备上调试的应用进行通信。通过使用其他端口,您可以对在连接至同一主机的不同设备或模拟器上运行的程序进行本地调试。

--adb=

此选项可指定 adb 工具可执行文件。只有在您未指定包含该可执行文件的路径时才需要使用此选项。

-d

-e

-s

这些标记与具有相同名称的 adb 命令类似。如果您有多个设备或模拟器连接至主机,请设置这些标记。其含义如下所示:

-d

连接至单个物理设备。

-e

连接至单个模拟器设备。

-s

连接至特定设备或模拟器。其中, 是设备的名称,与 adb devices 命令列出的相同。

此外,您也可以定义 ADB_SERIAL 环境变量来列出特定的设备,而无需指定特定选项。

--exec=

-x

此选项可指示 ndk-gdb 在连接到要调试的进程后,运行在 中找到的 GDB 初始化命令。如果您要重复执行某些操作(如设置断点列表,然后继续自动执行),该功能非常有用。

--nowait

解除 Java 代码的暂停状态,直到连上 GDB。传递此选项可能会导致调试程序错过早期的断点。

--tui

-t

启用文本界面(如果可用)。

--gnumake-flag=

此选项是在查询 ndk-build 系统以获取项目信息时要传递到该系统的一个(或多个)额外标志。您可以在同一个命令中使用此选项的多个实例。

注意:此表中的最后三个选项仅适用于 ndk-gdb 的 Python 版本。

线程支持

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

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

Program terminated with signal SIGTRAP, Trace/breakpoint trap.

The program no longer exists.

android gdb 命令大全,ndk-gdb  |  Android NDK  |  Android Developers相关推荐

  1. android 系统(6)---Android ADB 命令大全

    原文链接:https://github.com/mzlogin/awesome-adb ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也 ...

  2. Android adb 命令大全

    转自:https://github.com/mzlogin/awesome-adb ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也是 ...

  3. android fastboot命令大全,安卓手机Fastboot模式百科介绍,Fastboot命令大全

    fastboot,英语翻译意思是快速启动.在安卓手机中fastboot是一种比Recovery更底层的刷机模式(俗称引导模式).就是使用USB数据线连接手机的一种刷机模式.相对于某些系统(如ios)卡 ...

  4. android fastboot命令大全,ADBFastboot常用命令

    adb wait-for-device && adb shell logcat -b main > main.txt 安装APK(如果加 -r 参数,保留已设定数据,重新安装fi ...

  5. android dd命令,【测试人员技能】Android shell 下dd命令浅析

    一.前言 小编在最近的过程中遇到了一个需要构造存储空间不足的场景,并且还需要覆盖验证各种机型,而单个拷贝大文件到测试机器又太繁琐,小编查阅资料发现下的dd命令可以协助小编完成此项任务,正好借此机会给大 ...

  6. android 手机命令大全,adb 命令大全

    adb是什么 adb的全称为Android Debug Bridge,就是起到调试桥的作用.它就是一个命令行窗口,用于通过电脑端与模拟器或者是设备之间的交互. adb有什么用 借助adb工具,我们可以 ...

  7. android模拟器命令大全,雷电安卓模拟器命令行整理贴

    10.删除模拟器 remove 11.新增,复制,查询的例子 12.安装.卸载.启动.关闭命令 installapp --filename installapp --packagename (2.0. ...

  8. android 手机命令大全,Android ADB命令大全

    root uid 0 gid 0 system uid 1000 gid 1000 shell uid 2000 gid 2000 app uid 10000 gid 10000 jarsigner ...

  9. android ADB命令大全(安装apk,跳转设置页面,获取应用包名,模拟点击等事件)

    获取内部版本号: adb shell getprop ro.build.display.innerver 2. 获取按键值: adb shell getevent 3. 获取apk信息: adb sh ...

最新文章

  1. php中address,address.php
  2. Java:Java的jar包之POI的简介、安装、使用方法(基于POI将Word、Excel、PPT转换为html)之详细攻略
  3. python学习笔记(二)— 集合
  4. Docker手动构建 nginx+py3+uwsgi环境
  5. liunx系统内核安装图形化界面
  6. python做的游戏可以导出吗_Python for RenderDoc批量导出模型和贴图
  7. K8S从懵圈到熟练 - 节点下线姊妹篇
  8. python中的下划线用法
  9. BUAAOO电梯作业总结
  10. vue源码分析系列之响应式数据(三)
  11. 有加密狗的软件怎样实现全网络电脑用_加密狗应用领域有哪些?为您揭开7大行业软件保护的奥秘...
  12. UCI机器学习数据库
  13. 在密码输入框内按回车就登陆的功能
  14. ORA-22285: 对不存在的目录或文件进行 FILEOPEN 操作 ORA-06512: 在 SYS.DBMS_LOB, line 523 ORA-06512: 在 line 6 查看错误堆
  15. 【01】制作第一个zblog模板第一期,第一步首先我们创建我们的模板基础信息以及申请成为zblog开发者
  16. 计算机专业博士发论文,计算机专业博士论文提纲范本模板 计算机专业博士论文大纲怎样写...
  17. 尚学堂视频笔记三:容器
  18. 动手学Excel数据分析与可视化
  19. RationalDMIS 7.1 量块程序 2020
  20. Java 字段在内存中存储是大端还是小端

热门文章

  1. 驾驶员行为监控系统:需要它来管理车队
  2. 使用Keil语言的嵌入式C编程教程(上)
  3. 目标形体形状轮廓重建:ICCV2019论文解析
  4. Mobileye_EyeQ4功能和性能
  5. 2021年大数据Spark(四十六):Structured Streaming Operations 操作
  6. 003_如何学好英语?
  7. 3.request response
  8. 一分钟了解负载均衡的一切
  9. AC日记——[Hnoi2017]影魔 bzoj 4826
  10. CSAPP(4):存储器层次结构