实验环境
windows开发平台
安卓模拟器(ARM架构+linux系统 已Root):
可以通过
adb shell getprop
指令查看当前设备的cpu架构arm-linux-androideabi
编译工具gdb
和gdbserver
皆存放在此开发包下
实验开始
第一步 编写测试代码 文件名为test.c
1 |
|
第二步 将测试代码编译成可执行文件
1 | arm-linux-androideabi-gcc.exe -g test.c -o main -static #输出可执行文件名为main |
第三步 将可执行文件传送到模拟器中
1 | adb push main /data/local/tmp |
第四步 将gdbserver
工具传送到模拟器中
1 | adb push gdbserver /data/local/tmp |
第五步 进入模拟器shell
窗口,使用gdbserver
执行程序
1 | ./gdbserver 192.168.177.71:23946 main #这里的ip是宿主机的ip 23946为监听端口 |
第六步 在宿主机中运行gdb
工具
1 | gdb.exe main #这里需要指定调试的执行文件 |
此时进入到gdb
模式
第七步 在gdb
模式下连接模拟器中的gdbserver
1 | (gdb) target remote 192.168.0.1:23946 #这里的ip是模拟器的ip |
连接成功后进入断点调试模式,该模式下可以使用~调试指令进行相关调试
开始调试
使用
list
指令列出所有源代码 可简写为l
1
(gdb) l
使用
break
指令设置断点位置 可简写为b
1
(gdb) b main #在main函数处打断点
使用
continue
指令运行到断点处 可简写为c
1
(gdb) c
使用
step
指令进行单步执行 可简写为s
1
(gdb) s #会进入函数内部
使用
next
执行进行单步执行 可简写为n
1
(gdb) n #不会进入函数内部
使用
print
指令打印变量的值 可简写为a
1
(gdb) p a #打印变量a的值
使用
quit
指令退出调试模式 可简写为q
1
(gdb) q
更多调试指令
关于arm-linux-androideabi
的获取
建议下载Android NDK
开发包,然后将里面的GCC套件单独抽出来使用,NDK提供了抽包脚本make-standalone-toolchain
,在bulid
目录的tools
文件夹中可以找到,执行脚本自动抽取打包成压缩包到当前目录:
1 | python make-standalone-toolchain.py --arch arm |
附加
如果是在非安卓系统的ARM模拟器上,比如qemu模拟器,那么直接使用官方的arm-none-linux-eabi
即可,即便是安卓设备,如果没有代码调试需求的话,仅仅是编译运行程序,也是完全够用了
但是你需要进行代码调试的话,由于android
系统的安全策略,arm-none-linux-eabi
包中的gdbserver
无法运行,提示:
1 | error: only position independent executables (PIE) are supported. |
为了解决这个问题,我们因此采用arm-linux-androideabi
,这里面的gdbserver
可以正常运行
上面的例子中使用的NDKr17的版本
本文为作者原创 转载时请注明出处 谢谢
乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站