1. 启动gdb
gdb [program名] # 比如gdb main
gdb [program名] core # 用于调试coredump的错误,需加上生成的core文件路径
gdb -p [pid] # 按进程号调试
2. 调试运行中的程序
当正在运行的程序出现故障,比如服务器程序,无法终止,就需要用attach [pid]来调试正在运行的服务器程序。
sudu gdb
# 进入gdb命令行模式
attach [pid]
detach # 退出调试
当然gdb -p [pid]也是一样的
sudo gdb -p [pid]
# 进入gdb命令模式
detach # 退出调试
3. 运行程序
run指令:简写r,在启动gdb环境之后,用于运行待调试的程序
set args:设置输入的参数
比如我们要启动调试Redis的哨兵服务器时,需要设置配置文件路径:
gdb redis-server
# 进入gdb命令模式
set args /home/wishmeluck/redis-6.0.5/redis-6.0.5/sentinel.conf --sentinel
r
4. 退出gdb
quit指令:简写q,如果程序正在运行,会有提示,防止误退出
# gdb命令模式
quit
5. 断点
break指令:简写b,加断点
如果我们要在setCommand函数位置加上断点:
# gdb命令模式
# 方式1
break t_string.c:99
# 方式2
break setCommand
# 方式3
break t_string.c:setCommand
break ... if cond:当只想在某个条件满足时才触发断点,使用if
比如我们想在main.cc的第七行打这样的断点:
# gdb命令模式
break main.cc:7 if cnt > 3
print cnt #显示cnt的值
info b:查看断点信息,info breakpoints,简写info b
disable、enable、delete:临时关闭、启用、彻底删除 断点
# gdb命令模式
info b
disable 1
enable 1
delete 1
6. 执行流程
continue指令:简写c,用于恢复break指令中断的程序,使其继续向下运行
step [count]指令:简写s,执行count个步骤,会进入函数体,缺省count就是默认执行一步
next [count]指令:简写n,逐函数执行,会执行完整个函数
finish指令:简写fin,执行完当前函数剩下的部分,set print finish [on | off]:控制finish的返回结果是否显示,show print finish:输出finish的返回结果是否显示(默认会显示返回结果)
return指令:在函数当前的位置返回,不管执行到什么位置
until指令:简写u,用于直接跳出循环体
# gdb命令模式
u main.cc:7 #执行到这一行
7. 显示
print指令:手动输出
display指令:自动显示,使用的方式和print一样,但是gdb每次在运行新一条语句时都会显示一次display的内容
list指令:显示源码,默认显示10行
whatis指令:显示类型
8. 补充
shell:如果想在gdb环境中执行Linux命令,可以在指令前加上shell即可
比如clear命令:
# gdb命令模式
shell clear
空行:在gdb下,直接回车,相当于重复执行上一条指令