gdb

gdb #

gcc 编译时加入 -g 参数,否则调试时看不到源代码

TUI #

  • Ctrl+X+A: 打开/关闭 TUI 窗口
  • Ctrl+X+2: 切换不同的 TUI 窗口
  • Ctrl+L: 因TUI不稳定,显示乱时需要刷新
layout src    显示代码视图
layout asm    显示汇编代码视图
layout regs   显示当前的寄存器状态和它们的值

启动 #

gdb <prog>
gdb <prog> core   调试core文件(core是程序非法执行后core dump后产生的文件)
gdb attach <PID>  调试运行中的程序
detach

命令 #

set args 10 20 30   指定运行时参数
show args           查看设置好的运行参数

start               执行程序,停止main第一句
run(r)              从头开始运行程序,直到下一个断点或程序结束

list(l)             列出源码
l 行号
l 函数名

disassemble         反汇编当前函数或指定的代码区域

next(n)
nexti(ni)           汇编指令,不进入函数内部
step(s)
stepi(si)           汇编指令,如果是函数调用则进入函数
continue(c)         从当前位置继续执行程序,直到下一个断点或程序结束
until               运行完当前循环
finish              运行完当前函数

info(i)
i locals            查看当前栈局部变量的值
i args              查看当前栈局部变量的值
i frame             查看当前栈
i frame 2           查看第2层栈
i reg               查看寄存器

backtrace(bt)       打印函数调用栈
frame <n>           切换当前栈

print(p) <expr>     打印变量的值
p/x $rsp            打印栈指针的值,以十六进制显示
x/s <addr>          以字符串查看内存地址内容
x/x <addr>          以16进制查看内存地址内容
x/2x <addr>         以16进制查看内存地址内容,2个单位
x/d <addr>          以10进制查看内存地址内容

display 变量名      每次停顿时自动显示
undisplay

set var sum = 0     修改变量值
call 函数(参数)

断点 #

break(b)
b 函数名
b 行号
b 文件名:行号
b 行号 if var > 0   条件断点
tbreak              临时断点,首次到达后自动删除的断点

i breakpoints
disable 断点号
enable 断点号
delete(d) 断点号
clear               清除所有停止点

观测点 #

watch <expr>        一旦表达式值有变化,马上停住
i watchpoints

cgdb #

ESC   切换到代码窗口
i     切换到 gdb 窗口

浏览代码是 vim 按键风格,在代码窗口其他一些快捷键

o     查看代码所在的文件
空格  切换断点
+/-   调整代码窗口大小
F5    Send a run command to GDB.
F6    Send a continue command to GDB.
F7    Send a finish command to GDB.
F8    Send a next command to GDB.
F10   Send a step command to GDB.

自定义配置 ~/.cgdb/cgdbrc

set ignorecase
set wso=vertical
set hls
map <F9> :until<cr>