gdb 常用操作记录
因为写了一段时间内核中的 objtool,出现一些问题时需要使用 gdb 进行调试。这里记录一下自己的常用操作。学习建议还是看 gdb manual,这是一点点笔记,gdb 的使用那可真是太多了。
gdb 配置
gdb 有一个配置文件 .gdbinit
,可以在里面修改 gdb 配置。我的配置:
1 | set pagination off |
禁止分页
开启历史记录
可以使用 ! 执行上一条命令
常用操作
我调试的东西需要传递参数给它:
1 | gdb --args ./tools/objtool/objtool -o arch/arm64/kernel/debug-monitors.o |
start
, next
info
print
一些就不记录在这了。
断点
打断点:
1 | b check.c:1111 |
针对某个函数:
1 | b func |
栈帧
查看栈帧(backtrace/bt):
1 | bt num |
0 表示当前正在执行的函数。
num 为查看栈帧的数量,不加 num 则显示全部。
如果 num 是正数,则栈帧从 0 开始计数,如果是负数,则从最大的栈帧编号开始计数。一个是正向,一个是反向。
1 | (gdb) bt |
1 | (gdb) bt -1 |
查看帧信息:
1 | info frame num |
num 为栈帧编号。
简写i f num
查看当前帧的所有局部变量和函数参数:
1 | info locals |
1 | info args |
切换帧:
1 | frame num |
num 是栈帧编号。简写
f num
结构体
查看结构体中的字段及类型:
1 | ptype struct |
1 | (gdb) ptype cfi |
查看结构体中的所有字段的值:
1 | (gdb) p cfi |
强转一下。
调用函数
1 | p func |
1 | (gdb) p offstr(insn->sec, insn->offset) |
多线程
info inferiors
查看进程列表attach pid
绑定进程 idinferior num
切换到指定进程上进行调试print $_exitcode
显示进程退出时的返回值set follow-fork-mode child
追踪子进程set follow-fork-mode parent
追踪父进程set detach-on-fork on fork
调用时只追踪其中一个进程set detach-on-fork off fork
调用时会同时追踪父子进程set schedule-multiple on
调试某进程时,其他进程正常执行
Author: xun
Link: http://blog.fooo.in/2023/10/02/gdb/gdb-memo/
License:
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。