当前位置: 首页 > news >正文

C语言基础18(GDB调试)

文章目录

    • GDB
      • GDB概述
        • 什么是GDB
        • **GDB**的主要功能
    • GDB的启动
        • GDB常见的启动方式
    • GDB的退出
    • GDB的常用命令
        • GDB查看源代码指令———list(1)
        • **GDB** 查看设置**------info**
        • **GDB** 查看内存
        • **GDB** 设置断点**---break (b)**
        • **GDB** 设置观察点**---watch**
        • **GDB** 程序调试
    • GDB完整使用演示
        • 检查你的**Linux**支不支持**GDB**
        • 我们可以通过网络在线安装
        • 启动**GDB**
        • 显示调试的代码
        • 设置调试断点
        • 调试代码
        • 退出**GDB**

GDB

GDB概述

什么是GDB

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

GDB的主要功能

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

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

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

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

需要注意的是:

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

GDB的启动

GDB常见的启动方式

在命令行中运行:

(1)gdb:

file	<filename>

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

set	args	arg1	arg2	...

(2)gdb <filename>

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

gdb	--args	<filename>	arg1	arg2	...

GDB的退出

在gdb中执行命令:

quit / q

GDB的常用命令

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

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

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**
info registers # 查看寄存器信息
info frame # 查看栈信息(帧信息)
info locals # 显示当前函数的所有局部变量名及其值
info break/b # 查看断点信息
info args # 显示当前函数的参数名及其值
info prog # 查看调试程序的执行状态
info files # 显示调试文件的详细信息
GDB 查看内存
查看内存变量的值 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)**
设定程序在运行过程中在指定的位置停下来,该指定的位置可以为源文件名、函数名、行号中的一个或多个组合的具有唯一性地址
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**
watchpoint 观察点,当观察对象的值变化时,会停止程序
watch <exp> # 为表达式或变量设置观察点,一旦值变化停止程序
rwatch <exp> # 当表达式或变量被读时,停止程序
awatch <exp> # 当表达式或变量被读,写时,停止程序
info watchpoints # 查看所有观察点信息
观察点可认为是特殊的断点
GDB 程序调试
启动程序: run # 从main开始运行
continue # 一直执行直到满足停止条件而停止
next/n # 单步执行,遇到函数不进入
step/s # 单步执行,遇到函数进入
finish # 执行当前函数的剩余指令,直到函数返回

GDB完整使用演示

检查你的Linux支不支持GDB

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

gdb --version

在这里插入图片描述

我们可以通过网络在线安装
sudo apt-get install gdb
启动GDB

启动GDB

gdb

在这里插入图片描述

打开需要调试的文件

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

file 2

在这里插入图片描述
上面的命令等价于:

gdb 2

在这里插入图片描述
(2) 针对有运行参数(main函数参数需要接收)的可执行程序

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

设置显示的行数

set listsize 20 // 设置显示的行数,默认显示10行

设置从哪一行开始显示

list 1 / l 1 // 1就是起始行号
设置调试断点

设置断点

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

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

清除断点

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

运行程序

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

打印输出

查看内存变量的值 print (p)
print/p i # 打印输出变量等数据
自动显示的变量值或表达式值 display
display i # 自动显示变量i的值
退出GDB
quit / q
http://www.lryc.cn/news/515056.html

相关文章:

  • 《向量数据库指南》——应对ElasticSearch挑战,拥抱Mlivus Cloud的新时代
  • c++的stl库中stack的解析和模拟实现
  • C语言——字符函数和内存函数
  • 查询docker overlay2文件夹下的 c7ffc13c49xxx是哪一个容器使用的
  • Golang的容器编排实践
  • 【51项目】51单片机自制小霸王游戏机
  • ArkTs之NAPI学习
  • 【数据库初阶】MySQL中表的约束(上)
  • 173. 矩阵距离 acwing -多路BFS
  • Linux下部署Redis集群 - 一主二从三哨兵模式
  • 实战设计模式之建造者模式
  • 活动预告 | Microsoft Azure 在线技术公开课:使用 Azure OpenAI 服务构建生成式应用
  • ubuntu安装firefox
  • 计算机网络原理(谢希仁第八版)第4章课后习题答案
  • RabbitMQ-基本使用
  • 从零开始学架构——互联网架构的演进
  • python +tkinter绘制彩虹和云朵
  • 重新整理机器学习和神经网络框架
  • TypyScript从入门到精通
  • 【MATLAB】绘制投资组合的有效前沿
  • matlab时频分析库
  • GBase 8s 数据库备份还原
  • C++模板相关概念汇总
  • MYSQL------sql基础
  • React Router 用法概览
  • 网络安全之高防IP的实时监控精准防护
  • 2024年中国新能源汽车用车发展怎么样 PaperGPT(二)
  • LINUXC 时间相关操作
  • 网络游戏之害
  • SpringMVC的消息转换器