环境:
pc = windows7 x64
phone = Android 4.03
(需要
root
权限)
准备:
gdbserver 可以在
NDK
目录下的
prebuilt
文件夹内找到(如下图所示,在三个
Android-
开头的文件夹中都有
gdbserver
文件夹,里面的
bin
文件就是编译好的
gdbserver
,根据自己
的
cpu
选择对应的
bin
程序,一般情况是
arm
),找到后可在对应文件的上级目录找到
Windows 下的
gdb
文件在
NDK
目录下的
toolchains
文件下,同样寻找对应的
cpu
的文
件夹如图
一般选择 arm-linux-androideabi –x.x
,然后在其
\prebuilt\windows-x86_64\bin
子目录可
以看到下图所示:
其中
arm-linux-androideabi-gdb.exe
就是我们要找的
gdb
程序(其他
cpu
请找对应的
gdb
可执行程序),这里为了方便使用,我将改目录加入了
path
环境变量,同时将
arm-linux
androideabi-gdb.exe
复制重命名为
gdb
。
如果找不到,可在
NDK
的根目录下直接搜索
gdb
和
gdbserver
,从结果中寻找。
第一步:手机端运行
gdbserver
在 cmd
控制台下使用
adb push
命令发送进手机,并使用“
adb shell chmod 777 +gdbserver
路径”的方法给文件可执行的权限,使用
cd
命令进入
gdbserver
所在目录,使用“
./ gdbserver
”
启动服务(这里有个小技巧,可以将文件
push
到
/system/bin/
目录,以后执行的时候就不需
要
cd
到
gdbserver
所在目录了,不过直接
push
可能
push
不到,需要在
pc
的
cmd
控制台下
输入“
adb remount
”之后再
push
,如果执行
chmod
时出现权限不够,请在
adb shell
命令
后增加
su
命令即“
adb shell su ….
”,以
root
权限运行,执行前请确认手机已经
root
,否则
可能会报错)
重新打开一个 cmd
窗口使用“
adb forward tcp:23946 tcp:23946
”对模拟器的数据进行转
发(如果在同一局域网内,不需要设置这步,这里设置是设置对于模拟器上数据的端口转发
到
pc
本地)
gdbserver
的启动命令有两种:
一种是 attach
方式,调试已经启动的程序;
一种是使用 gdbserver
启动程序的方式(这种方式我只会启动
bin
程序);
两种方式的命令格式分别为:
gdbserver :23946 + bin 程序路径
gdbserver :23946 –-attach [PID]
其中:23946
与
gdbserver
之间有空格请注意,数字代表
listen port
,可自己设置,不过注
意上面的
adb forward
转发也需要同步修改。 (使用 ps
命令可以查看要当前系统运行的进程的
PID
,执行是请检查自己的权限,最好 是 su
的
root
权限)
第二步:
pc
端运行
运行 gdb,如图所示
依次输入:
set disassemble-next on
(打开这个,显示汇编代码)
set step-mode on (打开单步调试)
target remote 127.0.0.1:23946
(连接上远程调试的
gdbserver
,同理如果是通过
wifi
或者其他网络进行调试,将
ip
修改为手机
ip
即可)
下图为连接上的视图
接下来你就可以使用 b
设置断点,
c
运行至断点,
s
和
n
进行单步调试
附:
gdb
常用命令:
b *0xFFFF
给这个地址下断点,注意前面的
*
和
0x
c
继续运行到断点
s
等价于
step into
n
等价于
step over
bt
查看堆栈
info registers
查看寄存器内容
info b
查看断点信息
delete break [n]
删除编号为
n
的断点
disas 0xFFFF,+20
显示这个地址后面
20
行内的汇编指令
kill
终止进程
file
加载文件(用这个命令可以加载符号表)(需要注意的是,这个指令的默认目录为
C:\Users\user
,建议将需要加载的文件复制过来加载)
help
获取帮助信息
ps
:
gdb
功能强大,不过限于我的水平,使用的不是很好,更多的功能请使用
help
命令、参
看
gdb
使用手册或者百度学习之。
版权声明:本文为jinganggiao原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。