1、gdb
gdb是GNU开源组织发布的一个强大的Linux下的程序调试工具。
GDB调试的三种方式:
-
目标板直接使用GDB进行调试某个程序。(例如gdb ./test)
-
目标板使用gdbserver,主机使用xxx-linux-gdb作为客户端。(例如在ubuntu(客户端)上调试qemu(目标板)中的arm64 linux)vmware + ubuntu + qemu + busybox + gdb 调试linux arm64内核
-
目标板使用ulimit -c unlimited,在进程crash时,生成coredump文件;然后主机使用xxx-linux-gdb ./test ./coredump。coredump机制与使用
2、常用命令
- disassemble: 反汇编,查看符号或者地址的汇编代码,例如"disas doupdate"
- bt: 打印堆栈调用信息,例如"bt full"不仅显示backtrace,还显示局部变量
- i r: 打印寄存器的值
- i proc m: 进程内存映射表
- info args: 打印当前函数的参数名及其值
- info locals: 打印当前函数中所有局部变量及其值
- info threads: 查看线程
- thread apply all bt: 打印所有线程堆栈
- thread n: 切换到某一个线程
- f/frame : 如果你要查看某一层栈的信息,你需要在切换当前的栈,n从0开始,是栈中的编号
- info frame: 打印出更为详细的当前栈层的信息
- p: 打印地址或者变量的值,例如"p 变量名"、"p {struct xxx} addr"表示按结构体方式打印
- p/x: 按16进制打印,例如"p/x {unsigned int[x]} addr"连续打印
p &((strcut xxx *)0->member:
打印结构体成员偏移- p sizeof(struct xxx): 打印结构体大小
- ptype struct xxx: 打印结构体定义的信息
x:
打印内存的值,格式为x/nfu addr
,以f
格式打印从addr
开始的n
个长度单元为u
的内存值。
//n:输出单元的个数。
//f:是输出格式。比如`x`是以16进制形式输出,`o`是以8进制形式输出等等。
//u:标明一个单元的长度。`b`是一个`byte`,`h`是两个`byte`(halfword),`w`是四个`byte`(word),`g`是八个`byte`(giant word)。
//以16进制格式打印数组a前16个byte的值:
(gdb) x/16xb a
0x7fffffffe4a0: 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07
0x7fffffffe4a8: 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f
- l: 打印地址对应的源码,例如l * address