Linux 调试器 —— 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
  • 25
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值