GDB

启动 GDB

gdb 可执行文件名

比如要调试 beansdb,则直接输入 gdb beansdb

设置断点

break main

break 可以简写成 b

断点可以通过函数名,当前文件内行号等设置:

break 函数名
break 行号
break 文件名:行号
break 文件名:函数名
break +偏移量 #当前位置之后 3 行
break -偏移量
break *地址

如果不设置指定断点,则默认是下一行设置断点。

b

可以通过 info 来看有哪些断点

i b # info break

运行

直接在 gdb 里面执行 run 命令就可以,如果本身有参数,还可以在后面加参数,比如启动某一个服务的时候需要配置文件,则需要在 run 后面跟响应的参数:

run -conf /etc/xxxxoooo.conf

显示栈帧

显示所有栈帧

backtrace

bt

info stack

where

显示前 N 个栈帧

bt N

显示最后 N 个栈帧

bt -N

显示局部变量与栈帧

bt full

显示变量

print

p

显示寄存器

info reg

i r

也可以在寄存器前添加 $ 显示各个寄存器的内容。

p $sp

p 输出信息的可以使用不同的格式

p/格式 变量

格式列表如下:

格式 说明
x 十六进制
d 十进制
u 无符号十进制
o 八进制
t 二进制
a 地址
c 字符串
f float
s string
i 机器码

x 可以显示内存中的内容,格式跟 p 类似

x/格式 地址

x/10i $pc // 查看 pc 寄存器指向地址开始的10条汇编

单步调试

n/next 下一步
s/step 下一步,可以进入函数内部
nexti 下一行汇编
stepi 下一行汇编,可以进入函数内部
c/continue 继续执行直到下一个断点

监视点

watch xxx // xxx 发生变化时暂停, xxx 通常为变量
awatch xxx // xxx 被访问或者发生变化时暂停
rwatch xxx // xxx 被访问时

改变变量的值

set variable xxx=123

attach 到进程

需要调试一个已经启动的进程时,可以这么做。

gdb

(gdb) attach 1234 //1234 为进程号

保存历史记录:

  • set history hilename demo.gdb
  • set history save