我们需要使用gdbserver依附到要调试的进程上,gdb通过adbd和手机上的gdbserver 进行socket通信
什么是 GDB 调试器?GDB是gnu组织开发的一个强大的unix程序调试工具,可以用它来调试Android上的C、C++代码
GDB主要功能:
-
启动程序
-
设置断点
-
查看程序
-
改变环境
使用gdb进行嵌入式调试的必需品,是gdb和gdbserver二进制文件,你可以在Android SDK的目录下找到它
网上的一些教程是说通过Android Studio SDK Tools来安装,但默认会安装最新版本的,我们这里手动安装即可
windows 安装NDK-gdb
在 Android NDK 目录下有个 ndk-gdb 脚本,它是由 Android NDK 提供且经过配置的 gdb 调试器的启动器
常用的 gdb 命令(按功能区分):
break :在代码的指定位置中断,这个是我们用得最多的一种。
WatchPoint :在变量读、写或变化时中断
CatchPoint: 捕捉点
append:如append memory用于将内存中的数据添加到指定文件的最后
call:调用一个函数,功能类似 IDA 的 AppCall
disassemble:反汇编当前栈帧的函数
display:每次程序停止运行时打印表达式的值
dump:读取内存中的数据和代码,并将其保存到文件中。如dump binary memory用于将指定内存中的数据保存到文件中
explore:打印表达式的值(gdb 要能识别它的类型)
find:在内存中查找数据
print:打印表达式的值
printf:不仅和 print 一样可用于打印表达式的值,还可用于指定格式化字符串
set:修改表达式的值
info:如info frame用于打印当前栈帧的信息
backtrace:打印所有栈帧的信息
down:选择并打印下一个栈帧的信息
up:选择并打印上一个栈帧的信息
frame:选择并打印指定栈帧的信息
return:将所选栈帧返回调用者
info:如info registers、info all-registers可用于查看所有寄存器的信息;info registers x0可用于查看 x0 寄存器的值
print:如print/x $pc表示以十六进制形式显示 pc 寄存器的值
set:如set $sp += 4用于将栈指针的值加4;set $x0 = 0用于将x0寄存器的值设为 0
stepi:单步步入。当遇到函数调用时,可进入此函数体
nexti:单步步过。当遇到函数调用时,不进入此函数体
until:快速退出循环
finish:执行程序,直到当前函数执行结束后返回
continue:继续运行被断点中断的程序
run:运行程序
kill:强行终止当前正在调试的程序
quit:退出 gdb
break:如break printf表示在printf()上设置断点
rbreak:用正则表达式的方式设置断点
tbreak:设置临时断点
delete:如delete n表示删除第 n 个断点
disable:如disable n表示禁用第 n 个断点
enable:如enable n表示启用第 n 个断点
save:如save breakpoints表示将当前断点信息保存为脚本文件
info:如info break用于查看所有断点信息
watch:设置监视点(需要硬件支持)。在没有源码的情况下,可对内存地址进行监视,功能类似 OllyDbg(Windows 平台调试器)的硬件读写断点
catch:如catch syscall用于捕获所有系统调用