GDB调试指南

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,加断点

GDB调试指南_第1张图片

如果我们要在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

GDB调试指南_第2张图片

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指令:手动输出

GDB调试指南_第3张图片

display指令:自动显示,使用的方式和print一样,但是gdb每次在运行新一条语句时都会显示一次display的内容

list指令:显示源码,默认显示10行

whatis指令:显示类型

8. 补充

shell:如果想在gdb环境中执行Linux命令,可以在指令前加上shell即可

比如clear命令:

# gdb命令模式
shell clear

空行:在gdb下,直接回车,相当于重复执行上一条指令

你可能感兴趣的:(Linux,C/C++,c++,linux)