ndk学习6: 使用gdb调试ndk程序一


生成debug版程序

方法一:

使用ndk-build编译时,加上如下参数NDK_DEBUG=1,之后生成so文件之外,还会生成gdbobserver,gdb.setup调式文件

?

方法二:

修改AndroidManifest.xml文件,增加debuggable属性为true

? ??<application?android:debuggable="true"? ...

Eclipse报错则在错误信息上点右键 Quickly fix 忽略掉错误即可

?

编译之后会生成和调试相关的文件如下:

?

libs目录下的gdbserver需要拷贝到虚拟机

gdb.setup是设置和符号相关的路径

obj下面的Hello是符号相关的路径

?

方法三:

在application.mk中加入

APP_OPTIM?:=?debug

NDK_DEBUG?=?1??

只会生成调试的符号文件,对应版本的gdbsever还需要自己从ndk中拿出来

?

启动调试

我们以x86的模拟器作为调试目标,首先编译x86版本的可执行文件

在工程目录下新建一个makefile文件

编写调试脚本如下:

MODALE_NAME :=
Hello

?
?

# x86 path

X86_TOOLS_PATH :=E:\Android\android-ndk-r10b\toolchains\x86-4.6\prebuilt\windows-x86_64\bin

X86_GDB_PATH := $(X86_TOOLS_PATH)\i686-linux-android-gdb.exe

X86_GDB_SERVER := E:\Android\android-ndk-r10b\prebuilt\android-x86\gdbserver\gdbserver

?
?

run_x86:

????adb push .\libs\x86\$(MODALE_NAME)
/data/local/tmp

????adb shell chmod 755
/data/local/tmp/$(MODALE_NAME)

????adb shell /data/local/tmp/$(MODALE_NAME)

?
?

debug_x86:

????adb forward tcp:12345 tcp:12345

????adb push $(X86_GDB_SERVER)
/data/local/tmp

????adb shell chmod 777
/data/local/tmp/gdbserver

????adb push .\obj\local\x86\$(MODALE_NAME)
/data/local/tmp

????adb shell chmod 777
/data/local/tmp/$(MODALE_NAME)

????adb shell /data/local/tmp/gdbserver :12345
/data/local/tmp/$(MODALE_NAME)

?
?

client_x86:

????$(X86_GDB_PATH)
.\obj\local\x86\$(MODALE_NAME)

# 1. target remote localhost:12345

# 2. gdb.setup

?

?

debug子过程:

大致的流程就是把gdbserver和debug版本程序拷贝到手机或者模拟器里面

给予可执行权限,然后用手机里面的gdbserver启动程序 等待PC上的gdb连接

?

?

client子过程:

就是连接手机中的gdb开始调试

?

?

然后执行make debug 服务端即开始等待客户端调试器的连接

出现Listen就对了

?

?

在换一个shell 输入make client?

进入gdb界面后输入target remote localhost:12345

报错:找不到动态链接库,这是没有设置gdb.setup的原因

?

?

解决方案:

将libs/x86目录下的gdb.setup中的2行命令放到gdb(client)中执行就好

?

?

如下图设置就好:

?

然后就可以开始调试了

?

注意:

1.如果模拟器是基于x86架构的
那么gdbserver也必须使用x86的?

2.如果你的工程的ABI是armeabi-v7a, 那么libs目录下的gdbserver也是armeabi-v7a的

?

?

GDB简易使用

gdb命令比较多,简单的介绍几个常用的命令:

list(l) 用来查看代码

break line_num(b) ?用于对指定的代码行下断点

info breakpoint 用于查看断点信息

run命令用于执行程序

next (n) 单步步过

step (s) 单步步入

continue (c) 执行到下一个断点

print 查看变量的值

backtrace 函数栈信息

clear 删除暂停处的断点

delete 删除一个断点

info func 显示函数信息

info local 显示当前函数的局部变量信息

q命令退出调试

?

?

?

时间: 2024-08-07 22:24:05

ndk学习6: 使用gdb调试ndk程序一的相关文章

使用 GDB 调试多进程程序

GDB 是 linux 系统上常用的调试工具,本文介绍了使用 GDB 调试多进程程序的几种方法,并对各种方法进行比较. 3 评论 田 强 ([email protected]), 软件工程师, IBM中国软件开发中心 2007 年 7 月 30 日 内容 在 IBM Bluemix 云平台上开发并部署您的下一个应用. 开始您的试用 GDB 是 linux 系统上常用的 c/c++ 调试工具,功能十分强大.对于较为复杂的系统,比如多进程系统,如何使用 GDB 调试呢?考虑下面这个三进程系统: 进程

《学习bash》笔记--调试shell程序

在shell中,最简单的调试助手时输出语句echo,可以通过把许多echo语句放到代码中进行调试,但必须花费足够的时间以定位 要查看的信息.可能必须通过许多的输出才能发现要查找的信息. 1.set选项 最基本的时set -o命令选项,当运行脚本时,这些选项可以用在命令行上,如下表所示: set -o选项      命令行选项      行为 noexec            -n                     不运行命令,值检查语法错误 verbose           -v  

使用gdb调试多线程程序总结

转:使用gdb调试多线程程序总结 一直对GDB多线程调试接触不多,最近因为工作有了一些接触,简单作点记录吧. 先介绍一下GDB多线程调试的基本命令. info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID. 前面有*的是当前调试的线程. thread ID 切换当前调试的线程为指定ID的线程. break thread_test.c:123 thread all在所有线程中相应的行上设置断点thread apply ID1 ID

用GDB 调试Java程序

陈皓 http://blog.csdn.net/haoel 背景 想要使用GDB调试程序,就需要用GNU的编译器编译程序.如:用GCC编译的C/C++的程序,才能用GDB调试.对于Java程序也是一样的,如果想要用GDB调试,那么就需要用GNU的Java编译器--GCJ来编译Java程序. 目前,很多Linux都不会预装Sun的JVM,取而代之是使用GNU的开源编译器来编译和运行Java程序.比如RedHat和Ubuntu,其默认安装都是使用GNU的Java编译器(gcj)和解释器(gij).当

gdb调试C程序

gdb调试 概述 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC.BCB的图形化调试器更强大的功能.所谓“寸有所长,尺有所短”就是这个道理. 一般来说,GDB主要帮忙你完成下面四个方面的功能: 1) 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序. 2) 可让被调试的程序在你所指定的调置的断点处停住.(断点可以是条件表达式) 3) 当

用 gdb 调试 GCC 程序【转】

用 GDB 调试程序 原著:Rick McMullin 用 gdb 调试 GCC 程序 转自:http://blog.csdn.net/bonnshore/article/details/7955422 Linux 包含了一个叫 gdb 的 GNU 调试程序. gdb 是一个用来调试 C 和 C++ 程序的强力调试器. 它使你能在程序运行时观察程序的内部结构和内存的使用情况. 以下是 gdb 所提供的一些功能: 它使你能监视你程序中变量的值. 它使你能设置断点以使程序在指定的代码行上停止执行.

linux下如何用GDB调试c++程序

原文地址:http://blog.csdn.net/wfdtxz/article/details/7368357 GDB 是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC.BCB的图形化调试器更强大的功能.所谓“寸有所长,尺有所短”就是这个道理. 一般来说,GDB主要帮忙你完成下面四个方面的功能: 启动你的程序,可以按照你的自定义的要求随心所欲的运行

【php】使用gdb调试php程序

1.简介 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC.BCB的图形化调试器更强大的功能.同时GDB也具有例如ddd这样的图形化的调试端 2.调试C/C++程序 直接上代码了 #include<iostream> using namespace std; long factorial(int n); int main() { int n(0); cin>>n; long val=factoria

用GDB调试多进程程序

在子进程中sleep,然后attach上去. gdb --pid=123456 ps出子进程的id,gdb attach 进程号. http://www.ibm.com/developerworks/cn/linux/l-cn-gdbmp/index.html 实际上,GDB 没有对多进程程序调试提供直接支持.例如,使用GDB调试某个进程,如果该进程fork了子进程,GDB会继续调试该进程,子进程会不受干扰地运行下去.如果你事先在子进程代码里设定了断点,子进程会收到SIGTRAP信号并终止.那么