C语言基础18(GDB调试)

文章目录

GDB

GDB概述

什么是GDB

GDB是GUN开源组织发布的一款强大的Unix/Linux的程序调试工具

GDB的主要功能

1.启动程序,按照程序员要求运行程序。

2.可以让程序在程序员设置的断点处停下来。

3.在程序停止的情况下,可查看程序中的变量等信息。

4.动态改变程序的运行环境。

需要注意的是:

程序在编译的时候需要跟上 -g参数,因为我们默认编译出来的版本是发布版本(Release),会删除一切调试可用信息,便于减小可执行程序的体积,但是我们调试的时候,我们需要保留调试信息,所以需要使用到调试版本(DeBug),所以需要指定参数 -g

GDB的启动

GDB常见的启动方式

在命令行中运行:

(1)gdb:

c 复制代码
file	<filename>

如果调试的程序需要命令行参数还需要执行如下指令:

c 复制代码
set	args	arg1	arg2	...

(2)gdb <filename>

如果调试的程序需要命令行参数则执行如下格式指令:

c 复制代码
gdb	--args	<filename>	arg1	arg2	...

GDB的退出

在gdb中执行命令:

c 复制代码
quit / q

GDB的常用命令

GDB查看源代码指令---------list(1)

显示指定位置的周围的源代码;可以通过行号、文件名、函数名以及三者之间的组合来定位指定位置,显示代码的行数可以通过设置listsize来设定,但是该设置只是本次有效;简化命令:l

shell 复制代码
set listsize 20 # 每次list显示指定区域的20行代码,默认10行
show listsizelist linenumber # 显示 linenumber附近的代码
list 50 # 显示当前源文件的第50行的附近代码
list function # 显示函数代码
list test.c:30 # 显示指定源文件的第30行的附近代码
list +/- # 向后/前显示源代码
list <first>,<last> # 显示first ,last之间的内容
list 100,200
GDB 查看设置**------info**
shell 复制代码
info registers # 查看寄存器信息
info frame # 查看栈信息(帧信息)
info locals # 显示当前函数的所有局部变量名及其值
info break/b # 查看断点信息
info args # 显示当前函数的参数名及其值
info prog # 查看调试程序的执行状态
info files # 显示调试文件的详细信息
GDB 查看内存
shell 复制代码
查看内存变量的值 print (p)
p i
p function::i
自动显示的变量值或表达式值 display
display i # 自动显示变量i的值
info display # 查看自动显示变量的信息
undisplay 1 2 # 取消1,2号自动变量显示
disable display 1 # 暂停显示1号自动变量
enable display 1 # 回复显示1号自动变量
GDB 设置断点**---break (b)**
SHELL 复制代码
设定程序在运行过程中在指定的位置停下来,该指定的位置可以为源文件名、函数名、行号中的一个或多个组合的具有唯一性地址
break/b linenum # 通过文件行号设置断点 b 20
break/b funcname # 通过函数名设置断点 b add
break/b linenum if exp # 设置条件断点: b 20 if i==8
断点维护:
info break # 查看断点信息
delete break 1 # 删除编号为1的断点,不带参数删除所有断点
enable break 1 # 启用编号为1的断点,断点信息enb 变为 y
disable break 1 # 禁用编号为1的断点,断点信息enb 变为 n
clear linenum # 清除linenum行上所有断点
GDB 设置观察点**---watch**
shell 复制代码
watchpoint 观察点,当观察对象的值变化时,会停止程序
watch <exp> # 为表达式或变量设置观察点,一旦值变化停止程序
rwatch <exp> # 当表达式或变量被读时,停止程序
awatch <exp> # 当表达式或变量被读,写时,停止程序
info watchpoints # 查看所有观察点信息
观察点可认为是特殊的断点
GDB 程序调试
shell 复制代码
启动程序: run # 从main开始运行
continue # 一直执行直到满足停止条件而停止
next/n # 单步执行,遇到函数不进入
step/s # 单步执行,遇到函数进入
finish # 执行当前函数的剩余指令,直到函数返回

GDB完整使用演示

检查你的Linux 支不支持GDB

我们一般检测,都是通过查看版本的方式,如果版本能查到,就说明支持,查询不到说明不支持

c 复制代码
gdb --version
我们可以通过网络在线安装
c 复制代码
sudo apt-get install gdb
启动GDB

启动GDB

c 复制代码
gdb

打开需要调试的文件

(1) 针对没有运行参数(main函数参数无需接收)的可执行程序

c 复制代码
file 2

上面的命令等价于:

c 复制代码
gdb 2

(2) 针对有运行参数(main函数参数需要接收)的可执行程序

c 复制代码
set a.txt b.txt ...
显示调试的代码

设置显示的行数

c 复制代码
set listsize 20 // 设置显示的行数,默认显示10行

设置从哪一行开始显示

c 复制代码
list 1 / l 1 // 1就是起始行号
设置调试断点

设置断点

​ 设定程序在运行过程中在指定的位置停下来,该指定的位置可以为源文件名、函数名、行号中的一个或多个组合的具有唯一性地址

c 复制代码
break/b linenum # 通过文件行号设置断点 b 18
break/b funcname # 通过函数名设置断点 b sum
break/b linenum if exp # 设置条件断点: b 20 if i==8

清除断点

c 复制代码
info break # 查看断点信息
delete break 1 # 删除编号为1的断点,不带参数删除所有断点
clear linenum # 清除linenum行上所有断点 clear 18
调试代码

运行程序

c 复制代码
run # 从main开始运行
continue # 一直执行直到满足停止条件而停止
next/n # 单步执行,遇到函数不进入
step/s # 单步执行,遇到函数进入
finish # 执行当前函数的剩余指令,直到函数返回

打印输出

c 复制代码
查看内存变量的值 print (p)
print/p i # 打印输出变量等数据
自动显示的变量值或表达式值 display
display i # 自动显示变量i的值
退出GDB
c 复制代码
quit / q
相关推荐
1101 110113 分钟前
STM32-笔记36-ADC(模拟/数字转换器)
笔记·stm32·嵌入式硬件
IT古董1 小时前
【机器学习】机器学习的基本分类-自监督学习-生成式方法(Generative Methods)
学习·机器学习·分类
WeeJot嵌入式1 小时前
C语言----数组
c语言·数组
yz7171 小时前
计算机网络•自顶向下方法:网络安全、RSA算法
学习·计算机网络·web安全
mit6.8241 小时前
[Qt] 输入控件 | Line | Text | Combo | Spin | Date | Dial | Slider
前端·qt·学习·ubuntu
叫我阿呆就好了1 小时前
C 实现植物大战僵尸(三)
c语言·开发语言
未完成的歌~2 小时前
Kali 离线安装 ipmitool 笔记
linux·运维·笔记
winner88813 小时前
对比学习损失函数 - InfoNCE
学习·算法·对比学习·infonce