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 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命令退出调试
ndk学习6: 使用gdb调试ndk程序一的更多相关文章
- Gdb调试多进程程序
Gdb调试多进程程序 程序经常使用fork/exec创建多进程程序.多进程程序有自己独立的地址空间,这是多进程调试首要注意的地方.Gdb功能强大,对调试多线程提供很多支持. 方法1:调试多进程最土的办 ...
- 使用 GDB 调试多进程程序
使用 GDB 调试多进程程序 GDB 是 linux 系统上常用的调试工具,本文介绍了使用 GDB 调试多进程程序的几种方法,并对各种方法进行比较. 3 评论 田 强 (tianq@cn.ibm.co ...
- 使用gdb调试多线程程序总结
转:使用gdb调试多线程程序总结 一直对GDB多线程调试接触不多,最近因为工作有了一些接触,简单作点记录吧. 先介绍一下GDB多线程调试的基本命令. info threads 显示当前可调试的所有线程 ...
- Debugging with GDB 用GDB调试多线程程序
Debugging with GDB http://www.delorie.com/gnu/docs/gdb/gdb_25.html GDB调试多线程程序总结 一直对GDB多线程调试接触不多,最近因为 ...
- 【疑难杂症】gdb调试多线程程序报错:interrupted system call
一. cmake生成可调试版本的程序,该内容参考自https://www.linuxidc.com/Linux/2014-03/98622.htm 具体内容如下: 1, 使用CMAKE编译确实很方便. ...
- 用GDB 调试Java程序
陈皓 http://blog.csdn.net/haoel 背景 想要使用GDB调试程序,就需要用GNU的编译器编译程序.如:用GCC编译的C/C++的程序,才能用GDB调试.对于Java程序也是 ...
- 用 gdb 调试 GCC 程序【转】
用 GDB 调试程序 原著:Rick McMullin 用 gdb 调试 GCC 程序 转自:http://blog.csdn.net/bonnshore/article/details/795542 ...
- 【php】使用gdb调试php程序
1.简介 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC.BCB的图形化调试器更强大的功能.同时GDB也具有例如d ...
- gdb调试多线程程序总结
阿里核心系统团队博客 http://csrd.aliapp.com/?tag=pstack Linux下多线程查看工具(pstree.ps.pstack) http://www.cnblogs.com ...
随机推荐
- C++ 以费波纳茨数列为权重的加权均值计算方法 wMA
#pragma once #include <iostream> using namespace std; template <typename T> double *wMA( ...
- C++11
http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list http://www.open-std.o ...
- Robot Framework--07 变量的声明、赋值及其使用
转自:http://blog.csdn.net/tulituqi/article/details/7984642 一.变量的声明 1.变量标识符 每个变量都可以用 变量标识符{变量名} 来进行 ...
- Docker Dockerfile COPY vs ADD
http://blog.163.com/digoal@126/blog/static/163877040201410341236664/ 在Dockerfile中, 我们可以使用ADD和COPY拷 ...
- git之https或http方式设置记住用户名和密码的方法
https方式每次都要输入密码,按照如下设置即可输入一次就不用再手输入密码的困扰而且又享受https带来的极速 设置记住密码(默认15分钟): git config --global credenti ...
- Effective Objective-C 2.0 — 第14条:理解“类对象“的用意
每个实例都有一个指向Class 对象的指针,用以表明其类型,而这些 Class 对象则构成了类的继承体系. 如果对象类型无法在编译期确定,那么就应该使用类型信息查询方法来探知. 尽量使用类型信息查询方 ...
- CSV文件的读取 导出
CSV文件是 逗号分隔值文件 内容基本是这么存的... 姓名,年龄,性别/r/n王有才,,男/r/n王二妞,,女 一行值内用逗号 , 分开 行与行之间用 /r/n 分隔 说白了,他其实是一个字符 ...
- 【转】Flume日志收集
from:http://www.cnblogs.com/oubo/archive/2012/05/25/2517751.html Flume日志收集 一.Flume介绍 Flume是一个分布式.可 ...
- MySQL数据库INSERT、UPDATE、DELETE以及REPLACE语句的用法详解
本篇文章是对MySQL数据库INSERT.UPDATE.DELETE以及REPLACE语句的用法进行了详细的分析介绍,需要的朋友参考下 MySQL数据库insert和update语句引:用于操作数 ...
- 大熊君大话NodeJS之------Stream模块
一,开篇分析 流是一个抽象接口,被 Node 中的很多对象所实现.比如对一个 HTTP 服务器的请求是一个流,stdout 也是一个流.流是可读,可写或兼具两者的. 最早接触Stream是从早期的un ...