文章目录
- 前言
- 一、启动与退出gdb
- 二、设置参数
- 三、启动程序
- 四、查看代码
- 五、设置显示行数
- 六、设置断点
- 七、查看与删除断点
- 八、设置断点状态
- 九、打印信息
- 十、单步调试
前言
gdb是GNU Debugger的缩写,是GNU项目开发的自由开源软件调试工具。GDB 是一套字符界面的程序集,可以使用命令 gdb 加载要调试的程序。
一、启动与退出gdb
# -g 将调试信息写入到可执行程序中
gcc -g main.c -o app#启动gdb
gdb app
(gdb) # gdb等待输入调试的相关命令#退出gdb
q
二、设置参数
#设置参数
set args 1 2 3 4 5
#展示参数
show args
三、启动程序
#方法一:启动程序, 最终会阻塞在main函数的第一行
start
#方法二:run可以缩写为 r, 如果程序中设置了断点会停在第一个断点的位置, 如果没有设置断点, 程序就执行完了
run
四、查看代码
# 使用 list 和使用 l 都可以
# 从第一行开始显示
(gdb) list # 列值这行号对应的上下文代码, 默认情况下只显示10行内容
(gdb) list 行号# 显示这个函数的上下文内容, 默认显示10行
(gdb) list 函数名
五、设置显示行数
# 以下两个命令中的 listsize 都可以写成 list
(gdb) set listsize 行数# 查看当前list一次显示的行数
(gdb) show listsize
六、设置断点
1、设置普通断点到当前文件
# 在当前文件的某一行上设置断点
# break == b
(gdb) b 行号
(gdb) b 函数名 # 停止在函数的第一行
2、设置普通断点到某个非当前文件上
# 在非当前文件的某一行上设置断点
(gdb) b 文件名:行号
(gdb) b 文件名:函数名 # 停止在函数的第一行
3、设置条件断点
# 必须要满足某个条件, 程序才会停在这个断点的位置上
# 通常情况下, 在循环中条件断点用的比较多
(gdb) b 行数 if 变量名==某个值
七、查看与删除断点
# 查看设置的断点信息
(gdb) i b #info break# 删除断点 delete == del == d
# 举例:
(gdb) d 1 # 删除第1个断点
(gdb) d 2 4 6 # 删除第2,4,6个断点
(gdb) d 1-5 # 举例, 删除第1到第5个断点
八、设置断点状态
1、设置断点无效
# 设置第2, 第4个断点无效
(gdb) dis 2 4# 设置 第5,6,7,8个 断点无效
(gdb) dis 5-8
2、设置断点生效
# 设置第2, 第4个断点生效
(gdb) ena 2 4# 设置 第5,6,7,8个 断点生效
(gdb) ena 5-8
九、打印信息
1、打印变量值
# 举例
(gdb) p i # 10进制
$5 = 3
(gdb) p/x i # 16进制
$6 = 0x3
(gdb) p/o i # 8进制
$7 = 03
2、打印变量类型
# 打印变量类型
(gdb) ptype i
type = int
(gdb) ptype array[i]
type = int
(gdb) ptype array
type = int [12]
十、单步调试
1、 step命令可以缩写为s, 命令被执行一次代码被向下执行一行,如果这一行是一个函数调用,那么程序会进入到函数体内部。
2、 finish如果通过 s 单步调试进入到函数内部, 想要跳出这个函数体, 可以执行finish命令。如果想要跳出函数体必须要保证函数体内不能有有效断点,否则无法跳出。
3、next命令和step命令功能是相似的,只是在使用next调试程序的时候不会进入到函数体内部,next可以缩写为 n。
4、 通过 until 命令可以直接跳出某个循环体,这样就能提高调试效率了。如果想直接从循环体中跳出, 必须要满足以下的条件,否则命令不会生效:
a.要跳出的循环体内部不能有有效的断点。
b.必须要在循环体的开始/结束行执行该命令。