gdb 全称 GNU symbolic debugger,是 Linux 下常用的程序调试器。
调试器的核心工作,主要是为了定位问题。废话不多说。
前序工作
gdb 的安装
yum install gdb # root用户
另外: gcc、g++ 默认形成的版本是 release,不是 debug 版本!所以想要在 Linux 下调试程序,需要在 Makefile 文件 中,添加 -g
选项 指定以 dubug 方式编译程序,如下:
mytest:test.c
gcc -o mytest test.c -g -std=c99
.PHONY:clean
clean:
rm -f myprocess
其中
目标文件 可以用 $@
代替
:右侧所有文件的依赖链表,可以用 $^
代替
比如上面的 Makefile 文件内容就可以编辑成如下:
mytest:test.c
gcc -o $@ $^ -g -std=c99
.PHONY:clean
clean:
rm -f myprocess
readelf
读取可执行程序的信息:
可执行的二进制程序遵循的规则就是 elf 格式
readelf -S [可执行程序名称]
可以查看 debug 版本里的调试信息文章来源:https://www.toymoban.com/news/detail-575819.html
readelf -S [可执行程序的 debug 版本名称] | grep -i debug
readelf -S [可执行程序的 release 版本名称] | grep -i debug
# 输入上述代码就不会出现调试信息,因为 release 是“用户版本”
基本操作
所有的查看语句,都不影响调试文章来源地址https://www.toymoban.com/news/detail-575819.html
l
:显示代码(list)
- 第一次输入 带行号,意味着从第几行开始打印
- 后面就只需要输
l
不用带行号了 - 再后面直接敲 回车
# 第一次
l [行号]
# 之后
l
r
:运行程序 / 开始调试(run)
- 运行程序
r
b
:打断点(breakpoint)
- 可以在 行号处 打断点
- 可以在 函数名处 打断点
# 在 行号处 打断点
b [行号]
# 在 函数名处 打断点
b [函数名]
info b
:查看 断点(information)
- 查看所有断点信息
- 重要信息包括:编号 Num、断点的位置描述 What、断点是否可用 Enb…
info b
d
:删除 断点(delete)
- 删除相应编号的断点
- 断点编号 可以输入 info b 查看
- 不加断点编号,意味着 删除所有断点
# 删除相应编号的断点
d [断点编号]
# 删除所有断点
d
disable
:关闭 断点
- 保留 断点 但不使用,对 暂时不需要 又 不便删除 的断点保留
- 编号可以输入 info b 查看
disable breakpoint [断点编号]
enable
:打开 断点
- 打开 关闭的断点
- 编号可以输入 info b 查看
enable breakpoint [断点编号]
n
:逐过程(next)
- 逐过程,不进入函数
n
s
:逐语句(step)
- 可以进入函数
s
bt
:查看函数调用信息
- 调用函数就要压栈,bt 可以查看程序带哦用函数的过程
bt
p
:临时 查看 变量 / 表达式 此时的数值
- 显示当前值,单次
p [变量 / 表达式]
display
:常显示 变量 / 表达式 此时的数值
- 设置后,每次走 n 的时候都可以将其数值打印出来供我们观测
- 可以显示:内置类型,结构体自定义类型,stl…
display [变量 / 表达式]
undisplay
:取消 常显示
- 输入常显示的编号才能读取
undisplay [常显示编号]
until
:执行区间代码
- 在函数内,进行指定位置跳转,执行完区间代码
until [行号]
finish
:执行 但 不进入 函数
- 在函数所在行使用,将函数执行完就停下来
finish
finish
:执行 但 不进入 函数
- 在函数所在行使用,将函数执行完就停下来
finish
c
:运行到下个断点处(continue)
- 从一个断点处,直接运行到下一个断点处
c
set var
:设置函数变量
- 设置某一个函数变量为特定的值,便于观测在该值下的运行结果
set var [n = xxx]
到了这里,关于【Linux】调试器:gdb 的基本使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!