生成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 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的原因

 

 

解决方案:

行命令放到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命令退出调试

 

 

 

最新文章

  1. 在Application中集成Microsoft Translator服务之获取访问令牌
  2. Guava学习笔记(1):Optional优雅的使用null
  3. string to byte[]
  4. C++中的数组
  5. 安全协议系列(四)----SSL与TLS
  6. 【leetcode】Happy Number(easy)
  7. 实现自己的js框架
  8. [OrangePi] Installation on SD Card
  9. c++ vector 简单实现。
  10. xtraTabControl 如何遍历每个选项卡 z
  11. 说说Python 中的文件操作 和 目录操作
  12. web 调用OPC HRESULT:0x80070005 (E_ACCESSDENIED))
  13. 【LeetCode】Min Stack 解题报告
  14. oracle存储过程的例子
  15. angularjs从零开始(一)
  16. 修改GDAL库支持IRSP6数据
  17. Speech语音播报
  18. unbuntu 安装 teamviewer
  19. 【转】为什么volatile不能保证原子性而Atomic可以?
  20. Web打印控件Lodop实现证件套打

热门文章

  1. python中,ascii,unicode,utf8,gbk之间的关系梳理
  2. live555库中的testRTSPClient实例
  3. CentOS与ubuntu添加eclipse桌面快捷方式的方法整理
  4. MVC缓存OutPutCache学习笔记 (二) 缓存及时化VaryByCustom
  5. CMD窗口如何调整大小 / 颜色
  6. 浅谈JavaScript中的能力检测
  7. idea中的svn配置
  8. PHP访问MSSQL数据库(实例代码)
  9. tar命令的详细解释
  10. 【8-22】java学习笔记04