您的位置:首页 > 其它

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

2016-08-02 22:36 477 查看

生成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命令退出调试

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: