gdb的使用

180 阅读2分钟

1、gdb

gdb是GNU开源组织发布的一个强大的Linux下的程序调试工具。

GDB调试的三种方式:

  1. 目标板直接使用GDB进行调试某个程序。(例如gdb ./test)

  2. 目标板使用gdbserver,主机使用xxx-linux-gdb作为客户端。(例如在ubuntu(客户端)上调试qemu(目标板)中的arm64 linux)vmware + ubuntu + qemu + busybox + gdb 调试linux arm64内核

  3. 目标板使用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

3、参考文档

1. gdb调试基础

2. gdb手册(debuging with gdb)(中文).pdf

3. 100个gdb小技巧