GDB调试

(5 mins to read)

常用命令

  • help, help command:查看帮助

设置

gdb启动时会先应用.gdbinit文件中的所有命令,可以把本次调试前需要重复输入的命令写进去。

  • set disable-randomization off:关闭程序的虚拟地址空间随机化
  • set print pretty on:优化结构体打印
  • set print array-indexes on
  • set history save on:保留历史命令
  • set pagination off:关闭分页显示
  • set confirm off:关闭确认请求

启动

  • set args xxx, --args program xxx:设置程序启动时的参数
  • show args:显示设置的参数
  • ulimit -c unlimited, gdb program core:调试coredump文件
  • attach pid, gdb program pid:附加到已运行的进程(ps aux | grep program查看pid)
  • file xxx:指定要调试的程序
  • symbol-file xxx:单独加载分离的调试信息
  • r, run:开始运行
  • start:开始运行并暂停在main函数入口
  • !command:执行shell命令
  • source xxx, -x xxx:执行脚本

断点

  • info breakpoints:查看已设置的断点
  • b linenumber
  • b filename:linenumber
  • b function
  • b test.c:23 if b==0:条件断点
  • condition 1 b==0:设置1号断点的条件
  • rbreak regex:作用于所有匹配regex的函数名
  • tbreak:设置临时断点,只生效一次
  • watch cond:观察某个变量或表达式的取值,每次发生变化时暂停(有硬件观察点和软件观察点,硬件观察点的数量有限)
  • disable:禁用断点
  • enable:启用断点
  • delete, delete number:删除断点
  • command number:设置在达到number号断点时自动执行的命令

查看信息

  • p, print:打印变量
    • p *d:打印指针指向的值
    • p *d@10:打印指针指向地址处10个值
    • p $sp:打印寄存器中的值
    • p/x:十六进制打印
    • p/t:二进制打印
    • p/c:字符打印
    • p/f:浮点数打印
  • x, examine:查看内存地址的值
    • x/nfu addr:n是单元数,f是打印格式,u是单元大小,addr是内存地址
    • u包括b(字节)、h(双字节)、w(四字节)、g(八字节)
    • x/4tb &e:查看变量e所在地址开始的4个字节的值
  • bt:查看调用栈
    • bt n:只显示前n层栈帧
  • frame number:切换到number号栈帧,通常用来查看父函数中的局部变量
  • info frame:查看当前栈帧信息
  • info args:查看当前函数参数
  • info locals:查看当前函数内的局部变量值
  • info registers:查看寄存器的值
  • info function:查看函数
  • info classes:查看类
  • info proc mappings:查看内存区域映射
  • call func(arg):调用函数;比如调用程序内提供的打印函数
  • ptype:打印变量类型
  • set $a=xxx:自定义变量,需要以$开头,用来简化一些长变量
  • dprintf location, formatting-string, expr1, expr2, ...:在程序的某行插入printf命令(动态打印)

调试

  • l, list:显示当前所在行及之后的10行源代码
  • n, next:单步执行
  • s, step:单步执行,函数调用则会进入函数内(step into)
  • ni, nexti:执行一条机器指令
  • si, stepi
  • c, continue:继续执行到下一个断点
  • u, until:继续运行到指定位置或者运行完当前的循环体
  • finish:继续运行直至当前函数结束

多进程

  • set follow-fork-mode child:在fork后跟踪调试子进程
  • info inferiors:查看调试的所有进程的信息(gdb称被调试进程为inferior)

多线程

  • info threads:查看所有线程信息
  • thread id:切换到id号线程
  • thread apply all bt:将命令作用到所有线程上
  • set scheduler-locking off/on:默认关闭调度器锁,此时运行调试的线程,其它线程也会运行。在开启时,则只有调试的线程会执行,其它线程暂停执行。此外还有step选项,它保证在单步执行时,永远保持在当前调试的线程下,但其它线程仍然会继续执行;而默认的off下,如果其它线程遇到断点,会自动切换到其它线程中。

tui

  • layout src:显示源代码窗口(Ctrl-x-a切换)
  • layout asm:显示汇编代码窗口
  • layout reg:显示寄存器窗口
  • Ctrl-l:刷新窗口

pretty-printer

  • python/shell command:运行python/shell命令
  • define:自定义命令

反向调试

  • record:开始记录当前调试程序的状态
  • reverse-step/reverse-next:反向单步执行
  • rr工具更加好用

Dashboard