NDK调试之ndk-gdb

NDK包含了一个辅助脚本ndk-gdb使你能够轻松地为你的 由NDK产生的机器码 启动一个调试会话。

要求

想要调试本地层代码,你必须遵循如下的要求:

  • 使用ndk-build脚本编译你的app。ndk-gdb脚本不支持使用传统的make APP=<name>这种方法的编译。
  • 在你的AndroidManifest.xml文件中,通过在<application>元素中包含android:debuggable属性并将该属性设置为true来启用app调试。
  • 编译你的app来在Android 2.2 (Android API level 8)或更新的版本上运行。
  • 在一个运行了Android 2.2或更高版本android的设备或模拟器上调试。对于调试,你的AndroidManifest.xml文件中声明的target API level并不重要。
  • 在一个Unix shell中开发你的app。在Windows上,使用Cygwin或试验性的ndk-gdb-py Python实现。
  • 使用GNU Make 3.81或更高的版本。
  • 如果你是在Eclipse中编译你的app,则请使用本本0.9.7或更高版本的ADT插件来编译。

用法

要调用ndk-gdb脚本,首先切换至应用程序目录或它的任何子目录下。比如:

cd $PROJECT
$NDK/ndk-gdb

在这里,$PROJECT指向你的项目的根目录,而$NDK指向了你的NDK的安装路径。

当你调用ndk-gdb时,它会配置会话来查找你的源文件及你已经生成的native libraries的symbol/debug版本。在成功attaching到你的应用进程之后,ndk-gdb输出一长串错误消息,提示它找不到各种系统libraries。这是正常的,因为你的主机不包含你的目标设备上这些libraries的symbol/debug版本。你可以安全地忽略这些消息。

接下来,ndk-gdb显示一个普通的GDB提示符。

你可以与ndk-gdb进行交互,就像与GNU GDB那样。比如,你可以使用b <location>来设置断点,及c (for "continue")来恢复执行。GDB命令的完整列表,请参考GDB 手册

注意当你退出GDB提示时,你正在调试的应用进程也会停止。这是一个gdb限制。

ndk-gdb处理非常多的错误情况,并在它发现了一个问题时显示一个有益的错误消息。这些检查包括确保满足下列的条件:

  • 检查ADB在你的path里。
  • 检查你的应用程序在它的manifest里声明了debuggable。
  • 检查设备上已经安装且具有同样包名的应用程序是可调试的。

默认情况下,ndk-gdb搜索一个已经运行的应用进程,如果找不到就显示一个错误。然而,你可以使用--start 或 --launch=<name>选项在调试会话之前自动地启动你的activity。更多详细信息,请参考选项部分

选项

要查看选项的完整列表,则在命令行输入ndk-gdb --help。表1展示许多常用的选项,并伴有清晰的描述。

表1. 常见ndk-gdb选项及它们的描述

使用这个选项启动ndk-gdb将启动你的应用manifest中首个可启动的activity。使用--launch=<name>来启动下一个可启动的activity。要dump可启动的activities的列表,则在命令行运行--launch-list。

    Option Description>
    --verbose
    这个选项告诉构建系统打印关于native-debugging会话建立的详细信息。这个选项只有在只有在调试 调试器无法连接app的问题,或ndk-gdb显示的信息不够时才需要。

    --force 默认情况下,ndk-gdb在发现有另外一个native debugging会话已经在相同的设备上运行时会自动退出。这个选项杀死另一个会话,并用新的替换。注意这个选项不杀死被调试的实际app,你必须另外杀死它。
    --start
    当你启动ndk-gdb时,默认情况下它会试着去attach到目标设备上你的app一个已经在运行的实例上。你可以通过使用--start覆盖这个默认行为来显式地在调试会话之前在目标设备上启动应用程序。

    --launch=<name>
    这个选项与--start类似,除了它允许你启动你的应用程序中一个特定actvitiy外。这个功能只有在你的manifest中定义了多个可启动activities时才有用。

    --launch-list
    这个便利选项打印在你的app manifest中发现的可启动的activity名字的列表。--start使用第一个activity名字。

    --project=<path> 这个选项制定app工程目录。如果你想要启动脚本而不必须先切换到项目目录中,则它很有用。
    --port=<port>
    默认情况下,ndk-gdb使用本地的TCP端口5039来与目标设备上它调试的app通信。使用一个不同的端口使你能够本地地调试连接到相同主机的不同设备或模拟器上运行的程序。

    --adb=<file>
    这个选项指定了可执行的adb工具。只有在你没有把adb的路径设置进path时这个选项才有必要。

  • -d
  • -e
  • -s <serial>

  • 这些flags与adb命令的同名flags非常相似。如果你有多个设备或模拟器连接到你的主机则设置这些flags。它们的含义如下:

    -d

    连接一个单独的物理设备。

    -e

    连接一个单独的模拟器设备。

    -s <serial>

    连接到一个特定的设备或模拟器。这里,<serial>是设备的名字,如同adb devices命令列出的那样。

    或者你可以定义ADB_SERIAL环境变量来列出一个特定的设备,而不需要一个特别的选项。

  • --exec=<file>
  • -x <file>

  • 这个选项告诉ndk-gdb在连接上它调试的进程之后执行在<file>中找到的GDB初始化命令。如果你想要做一些重复性的事情的话它很有用,比如设置一个断点的列表,然后自动地恢复执行。

    --nowait
    禁止中断Java code直到GDB连接上。传入这个参数可能导致调试器丢失早期的断点。

    --tui -t
    如果可用的话就启用Text User Interface。

    --gnumake-flag=<flag>
    This option is an extra flag (or flags) to pass to the ndk-build system when querying it for project information. You can use multiple instances of this option in the same command.

    --stdcxx-py-pr={auto|none|gnustdcxx[-GCCVER]|stlport}
    Use specified Python pretty-printers for displaying types in the Standard C++ Library. auto mode works by looking at the .so files for alibstdc++ library, and as such only works for a shared library. When linking statically to a libstdc++ library, you must specify the required printers. The default is none.

注意:这个表中最后的三个选项只有Python版本的ndk-gdb可用。

线程支持

如果你的app运行在一个比Android 2.3 (API level 9)更老的平台上,则ndk-gdb不能适当地调试本地线程。调试器只能调试主线程,abd完全忽略其它线程的执行。

使用一个版本早于2.3的Android将导致ndk-gdb在显示GDB提示符之前先显示下面的消息:

Thread debugging is unsupported on this Android platform! 

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

Program terminated with signal SIGTRAP, Trace/breakpoint trap.
      The program no longer exists.

原文地址。

Done。

时间: 2024-11-05 06:03:08

NDK调试之ndk-gdb的相关文章

使用GDB调试Android NDK native(C/C++)程序

使用GDB调试Android NDK native(C/C++)程序 先说明下,这里所谓的ndk native程序跟Android上层java应用没有什么关系,也不需要涉及jni来封装native接口,通俗来讲,就是把编译好的纯C/C++程序,push到Android设备或者仿真器上,然后在设备上运行该程序.而调试则是通过attach到gdbserver来实现.推荐在Ubuntu或者mac osx下来进行,windows下要安装cygwin来模拟posix环境,速度很慢的说.具体操作如下: 0.

使用GDB调试Android NDK native(C/C++)程序-转

最 近写了些需要跨平台兼容的C++库,Android是其中需要兼容的平台之一.区别于Windows,Mac中功能强大的IDE环境,官方并没有为 Android ndk提供太多的支持.因此,尝试了下通过一些配置使用gdb来调试Android ndk的C++程序,感觉还算方便,记录下来跟大家分享. 先 说明下,这里所谓的ndk native程序跟Android上层java应用没有什么关系,也不需要涉及jni来封装native接口,通俗来讲,就是把编译好的纯C/C++程 序,push到Android设

Eclipse+CDT+GDB调试android NDK程序(转)

Eclipse+CDT+gdb调试android ndk程序 先介绍一下开发环境,在这个环境下,up主保证是没有问题的. ubuntu 11.10 eclipse 3.7(indego) for java jdk 6 android sdk 2.2 andrid ndk r7 当然,在windows环境下通过cygwin等工具也是可以实现gdb调试的,我也确实实现过.但是性能实在太低,卡的根本没法用.Linux下直接用gdb调试本地方法是很流畅的. 再确定安装并配置好开发环境之后,就可以开始了.

Android NDK调试C++源码(转)

[原创文章,转载请保留或注明出处,http://download.csdn.net/download/bigmaxim/5474055] 1. 相关软件 adt-bundle-windows-x86.zip --- Eclipse集成ADT插件,需要联网安装相应的Android SDK. jdk-6u43-windows-i586.exe --- JDK6 Eclipse运行需要JAVA环境,编译ANDROID应用也需要JAVA编译器. android-ndk-r8e-windows-x86.z

Android NDK调试出错Unknown Application ABI, Unable to detect application ABI&#39;s的解决方案

今天在调试Android NDK的时候,ADT的控制台报了这个错误: Unknown Application ABI, Unable to detect application ABI's 在网上查了好久,终于找到了解决方案: 在工程的jni文件夹下面新建一个Makefile类型的文件,文件名为Application.(注:如果你不知道怎么新建Makefile类型的文件,可以把jni文件夹下的Android.mk文件在原地复制一份,打开之后修改里面的内容即可). 如下图: Android NDK

Eclipse替代ndk-gdb断点调试Android NDK程序

一 概述: Eclipse调试NDK程序的操作并不难,难的是环境的搭建.光是安装Eclipse就有不少问题,真是"大错不犯,小过不断"不胜期烦.在网上,已经有先行者记录下了Eclipse断点调试Android NDK程序的方法: <Eclipse + ADT(包括NDK Plugin) + CDT 搭建Android NDK开发环境>网址:http://blog.sina.com.cn/s/blog_48ed03c80101nhei.html 我遇到的情况与上文有些不同,上

Android NDK调试出错Unknown Application ABI, Unable to detect application ABI&amp;#39;s的解决方式

今天在调试Android NDK的时候,ADT的控制台报了这个错误: Unknown Application ABI, Unable to detect application ABI's 在网上查了好久.最终找到了解决方式: 在project的jni目录以下新建一个Makefile类型的文件,文件名称为Application. (注:假设你不知道怎么新建Makefile类型的文件,能够把jni目录下的Android.mk文件在原地复制一份.然后重命名为Application.打开Applica

NDK学习二: NDK目录结构

NDK目录结构 NDK下载好之后目录结构如下: 目录名 描述 build   存放和编译相关的脚本文件,最外面的ndk-build就是调用该目录下的makefile文件,其中makefile文件都存放在build/core目录 docs  帮助文档 platforms  存放不同android版本,不同平台架构的头文件和库文件 prebuilt  存放和编译相关工具比如make.exe samples ndk代码例子,用根目录下的ndk-build即可编译 source 源码目录,有一些头文件和

Android NDK:②第一个NDK程序(创建步骤&amp;一些问题)

Android NDK:②第一个NDK程序(创建步骤&一些问题) 本节内容是:演示搭建第一个NDK程序 Android NDK第一个NDK程序创建步骤一些问题 创建一个Android Project Java代码中声明native方法 创建Jni文件夹编写ccpp代码 为项目添加NDK支持 新建配置一个Builder 调用了native方法的地方加载库 好了把程序跑起来 总结 遇到的问题 1.创建一个Android Project 直接创建一个新的Android Application Proj

gd调试命令,gdb调试core文件

使用 gcc -g test.c -o test.out 编译程序,只有加-g参数才支持gdb调试: 然后 gdb ./test.out 运行可执行文件,进入gdb调试模式(gdb),在括号后面的输入命令: (gdb)help:查看命令帮助 (gdb)start:单行执行 (gdb)l:查看源程序 (gdb)n:执行下一行 (gdb)s:进入被调函数里面 (gdb)bt:查看函数调用栈 (gdb)p 变量:打印变量值 (gdb)f:切换函数栈帧 (gdb)run:重新开始运行文件 (gdb)fi