Linux 调试器 —— gdb 的使用
- 前置条件
- debug 模式 和 release 模式
- gdb 下载
- 基础操作
- 退出调试器
- 查看源代码
- 运行程序
- 断点
- 打断点
- 查看断点
- 取消断点
- 关闭断点
- 开启断点
- 单步执行
- 逐过程
- 逐语句
- 打印表达式值、变量值、地址等等
- 单次查看
- 常显示
- 运行至下一个断点处
- 运行完所在函数,就停下来
- 跳转至指定行
- 查看当前栈帧局部变量的值
- 修改变量的值
- 查看各级函数调用及参数
在写代码时,出现错误 Bug 解决不了总是要调试的,如果是图像化界面(类似 vs2019),那倒还好调试,但是对于服务器端的命令行界面,很难进行像样的调试,所以接下来介绍开发工具调试器:gdb
本篇由于图片较多,看起来繁杂,请利用目录索引翻找
前置条件
debug 模式 和 release 模式
首先要知道,一份代码可以被 两种模式 编译,分别是 debug 模式 和 release 模式 ,而 debug 模式 才能被调试,这对程序员来说是必不可少的; release 模式 是发行版,是给用户使用的,并不含 调试信息 ,所以被 gcc
编译出来的同样一份代码,在 debug 模式 下编译出来的 二进制程序 文件大小要大于 release 模式 下的
而 gcc
默认是以 release 模式 下编译,需要加上 -g
选项才能变成 debug 模式 ,就像下面这样:
gcc gdbtest.c -o gdb_debug -g
那么 gdb_debug
就是 含有调试信息的二进制可执行程序 ,我们是 对此二进制可执行程序进行调试
gdb 下载
运行以下指令即可:
sudo yum install gdb.x86_64 -y
基础操作
有了类似上面的 gdb_debug
文件,就可以运行 gdb
指令了:
gdb gdb_debug
可以看到如下信息:
退出调试器
运行如下指令即可:
quit
q
查看源代码
使用 l
或者 list
均可:
list 源代码文件名:此文件内行号或者函数
l 源代码文件名:此文件内行号或者函数
例子:
list gdbtest.c:main
list gdbtest.c:1
l gdbtest.c:main
l gdbtest.c:1
可是这样只能看见默认的 10 行,所以我们可以先运行 l gdbtest.c:1
指令,然后一直 Enter
,查看所有代码:
运行程序
run
或
r
断点
打断点
b 源代码文件名:此文件内行号或者函数
例子:
b gdbtest.c:17
b gdbtest.c:AddToTarget
查看断点
info b
i b
Num
是指 断点编号
Enb
是指 断点的使能 , y
表示 yes , 表明断点为开启状态 ; n
表示 no ,反之
取消断点
d 断点编号
例子:
d 1
关闭断点
关闭断点时,断点不会生效
disable 断点编号
开启断点
enable 断点编号
单步执行
逐过程
逐过程 是显然的 单步执行 ,但对于函数而言,会 把函数当成一条语句直接执行,而不进入 ,所以一个函数就是一个原子的过程
单步执行 后,会将打印结果也给我们显示出来
next
n
如图可知:我们没有进入 AddToTarget()
函数的内部
逐语句
这个就很好理解了,自己所写的每一条语句都 单步执行 ,包括函数内部语句
逐语句单步执行 后,也会将打印结果也给我们显示出来,甚至会将传过来的参数值都为我们指明
step
s
如图可知:我们进入了 AddToTarget()
函数的内部
打印表达式值、变量值、地址等等
单次查看
使用 print
或者 p
均可
p 变量
p 表达式
常显示
会帮我们一直显示出来想要查看的值
display 变量
想要 关闭常显示 ,如下指令:
undisplay 变量编号
运行至下一个断点处
continue
c
运行完所在函数,就停下来
finish
跳转至指定行
until n
查看当前栈帧局部变量的值
info local
修改变量的值
set var 变量=值
查看各级函数调用及参数
bt