首页 > 数据库技术 > 详细

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

时间:2016-08-02 23:49:30      阅读:315      评论:0      收藏:0      [点我收藏+]


生成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.如果你的工程的ABIarmeabi-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命令退出调试

?

?

?

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

原文:http://www.cnblogs.com/bingghost/p/5731020.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!