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

《告别Bug!GDB/CGDB调试实战指南》

坚持用 清晰易懂的图解 + 代码语言,让每个知识点变得简单!
🚀呆头个人主页详情
🌱 呆头个人Gitee代码仓库
📌 呆头详细专栏系列
座右铭: “不患无位,患所以立。”
在这里插入图片描述


《"告别Bug!GDB/CGDB调试实战指南"》

  • 前言
  • 目录
  • 一、debug和release
  • 二、环境准备
  • 三、gdb/cgdb的使用
    • 🛸GDB 与 CGDB 对比
    • 🛸GDB 调试命令速查表
    • 🛸CGDB 调试命令速查表
    • 🛸启动gdb
    • 🛸查看行号对应x行代码
    • 🛸运行程序
    • 🛸查看函数代码
    • 🛸断点
      • 🍑查看断点
      • 🍑删除断点
      • 🍑禁用,启用断点
    • 🛸调试
      • 🍑逐过程 、 语句调试
    • 🛸打印值
    • 🛸跟踪、取消变量
    • 🛸设置局部变量值
    • 🛸跳到下一个断点
    • 🛸跳到指定行
    • 🛸函数调用堆栈


前言

🚀 欢迎来到《Linux系统实战》!
这里是命令行到内核的跃迁基地,也是你从"rm -rf恐惧症"到"权限管理大师"的修炼场。

🔍 专栏特色

  • 图解+实战:用最直观的方式拆解Linux核心机制
  • 从应用到底层:覆盖Shell脚本、系统调优、内核模块开发
  • 真实场景:每篇附服务器运维/开发中的实际问题解决方案

💡 学习建议
1️⃣ 先动手尝试(搞崩了也没关系)
2️⃣ 对照文章分析原理
3️⃣ 用文末【实战任务】巩固技能

📌 Linux经典名言
“Linux不是背出来的,是在一次次Permission denied中练出来的!”

(正文开始👇)


目录

一、debug和release

程序的发布方式有两种, debug 模式和 release 模式

  • 在linux中gcc/g++ 出来的⼆进制程序,编译器默认生成的可执行程序(二进制程序)是release发布版本,即追求性能的版本
  • 如果想要生成debug版本的可执行程序,就需要我们在使用gcc/g++工具将源文件进行编译链接生成二进制程序的时候进行手动指定选项-g添加debug信息,使我们的可执行程序可以被执行追踪
  • 通常debug版本由于添加了debug调试信息,通常都是比默认生成的release版本的所占用的空间大
  • gcc 要进行编译的文件 -o 可执行文件名 -g
    在这里插入图片描述
    我们可以发现动态链接的debug版本占用空间略大于release,静态链接也是如此

readelf -S 可执行文件名
可执行文件形成的时候不是无序的,而是有独特的格式,可执行程序有自己的二进制格式(elf格式),我们可以使用readelf -S 可执行文件名,来进行查看可执行文件的二进制格式
在这里插入图片描述
同时我们还可以借助管道,使用grep对二进制格式中的信息进行搜索,其中-i选项是忽略大小写进行查找,由于test是release是发行版本,没有添加debug信息,所以无法查找到debug,test_debug是debug版本,添加了debug信息,所以可以查找到debug
在这里插入图片描述


二、环境准备

  1. 编写要进行调试的代码,创建一个test.c的文件用于编写如下代码,这里编写了一个求x减到1的总和函数用于进行我们的调试
#include <stdio.h>int sum(int s, int e) {int result = 0;for(int i = e; i >= s; i--) {result += i;}return result;
}int main() {int start = 1, end = 100;printf("I will begin!\n");int n = sum(start, end);printf("running done, result is: [%d~%d]=%d\n", start, end, n);return 0;
}
  1. 创建自动化构建工具的文件makefile,并写入指令,这里特别注意由于我们想要生成的是可调试的debug版本的可执行程序,那么要在我们使用gcc命令后面加入-g选项,底行模式wq保存退出之后,在命令行运行make指令生成debug版本的二进制程序test
test:test.cgcc test.c -o test -gclean:rm -f test
  1. 检查,当你的程序使用readelf -S 文件名 | grep debug查找到如下debug信息代表你生成dubug版本的二进制程序成功,该程序可以使用gdb进行调试
    在这里插入图片描述

三、gdb/cgdb的使用

🛸GDB 与 CGDB 对比

特性GDB(命令行调试器)CGDB(增强版GDB)
用户界面纯命令行交互分屏界面(代码窗口 + GDB 终端)
代码显示需手动 list 查看代码自动高亮显示源代码
调试体验需手动输入命令(如 nextprint支持快捷键操作(类似 Vim,如 F2 切换窗口)
代码导航需用 breaklist 跳转可直接在代码窗口浏览和设置断点(空格键)
适用场景适合简单调试或远程调试(如服务器环境)适合本地开发,提高调试效率(直观的代码导航)

🛸GDB 调试命令速查表

命令/缩写作用样例
list / l显示源代码(从上次位置开始,每次10行)list / l 10
list / l 函数名列出指定函数的源代码list main
list / l 文件名:行号列出指定文件的源代码list mycmd.c:1
run / r从程序开始连续执行run
next / n单步执行(不进入函数)next
step / s单步执行(进入函数)step
break / b [文件名:]行号在指定行号设置断点break 10 / break test.c:10
break / b 函数名在函数开头设置断点break main
info break / info b查看所有断点信息info break
finish执行到当前函数返回finish
print / p 表达式打印表达式的值print start+end
print / p 变量打印变量的值p x
set var 变量=值修改变量的值set var i=10
continue / c继续执行程序continue
delete breakpoints / d breakpoints删除所有断点delete breakpoints
delete breakpoints n / d breakpoints n删除指定序号断点delete breakpoints 1
disable breakpoints禁用所有断点disable breakpoints
enable breakpoints启用所有断点enable breakpoints
info breakpoints / i breakpoints查看断点列表info breakpoints
display 变量名跟踪显示变量(每次停止时)display x
undisplay 编号取消跟踪显示undisplay 1
until 行号执行到指定行号until 20
backtrace / bt查看函数调用栈及参数backtrace
info locals / i locals查看当前栈帧的局部变量info locals
quit退出GDBquit

以下是整理成 CSDN Markdown 表格格式CGDB 调试命令速查表,包含 基础 GDB 命令CGDB 专属快捷键,方便快速查阅:


🛸CGDB 调试命令速查表

分类命令/快捷键作用示例/说明
通用指令break / b设置断点b main(在 main 函数断点)
run / r启动程序run
next / n单步执行(不进入函数)next
step / s单步执行(进入函数)step
print / p打印变量值p x
continue / c继续运行程序continue
quit / q退出调试器quit
CGDB 快捷键Esc从命令窗口切换到代码窗口Esc 后可用方向键浏览代码
i从代码窗口切换到命令窗口i 后输入 GDB 命令
空格在代码窗口设置/取消断点光标移到目标行按 空格
/ + 文本在代码窗口搜索文本/sum(搜索 sum 函数)
: + 行号跳转到指定行:20(跳转到第 20 行)
F2切换代码窗口和命令窗口快速切换焦点
F6在代码窗口快速设置断点等效于 空格
辅助功能info break / i b查看所有断点info break
delete / d删除断点d 1(删除断点编号 1)
display持续显示变量值display x(每次暂停时打印 x

🛸启动gdb

sudo yum install -y gdb            #gdb下载
sudo yum install -y epel-release  # 启用EPEL仓库
sudo yum install -y cgdb         # 安装CGDB

gdb 可执行文件名,观察到如下场景即为我们的gdb调试器启动成功,那么接下来我们将在(gdb)命令行中输入调试命令进行我们程序的调试。
在这里插入图片描述

q,退出gdb
在这里插入图片描述


🛸查看行号对应x行代码

  • l n,n代表你所要查看行号,即可显示该行号对应代码,如果输入的行号为1,那么会从第1行开始显示共计10行代码,如果该行号为一个中间的行号,那么会居中显示该行号,并且显示该行号上5行,下5行,共计10行代码
  • gdb会默认记住命令,如果你输入命令后,下一次输入默认继续执行上一次的命令,并且如果你查看的是行号会继续从上一次查看的最后一行的位置继续向下查看
    在这里插入图片描述

🛸运行程序

r ,可以运行程序,如果没有设置断点,那么默认执行到程序的最后,如果设置了断点,那么默认运行到第一个断点的位置
在这里插入图片描述

🛸查看函数代码

l 函数名
在这里插入图片描述


🛸断点

  1. b n,n代表行号,在某一行设置断点
  2. b 函数名,在函数的开头设置断点
  3. b 源文件: n,在源文件行号为n的位置处设置断点
    在这里插入图片描述

🍑查看断点

如果你想查询断点信息 info b
在这里插入图片描述


🍑删除断点

d n,这个n代表断点的序号,例如下图中的Nnm那一行代表的序号
在这里插入图片描述
d breakpoints,可以删除所有断点
在这里插入图片描述


🍑禁用,启用断点

  1. disable n,这个n代表断点的序号,禁用断点
  2. enable n,这个n代表断点的序号,启动断点
    在这里插入图片描述

🛸调试

  1. 这里的调试过程一定是r先运行起来才能进行逐过程调试或逐语句调试
  2. n,逐过程调试,类似于vs中的F10,不会进入函数
  3. s,逐语句调试,类似于vs中的F11,会进入函数

🍑逐过程 、 语句调试

在这里插入图片描述


🛸打印值

p 变量,调试运行起来,可以进行打印变量对应的值(这里的作用仅仅是打印,无其它作用)
在这里插入图片描述


🛸跟踪、取消变量

display 变量名,跟踪查看一个变量,每次停下来都显示它的值,类似于vs中的监视窗口监视变量的作用
在这里插入图片描述
undisplay,可以取消对所有变量的追踪(这里不可以单独取消对某个变量的追踪,要取消只能统一取消对全部变量的追踪)
在这里插入图片描述


🛸设置局部变量值

set var 变量名=你要给变量设置的值,比如循环前50次没有问题,你想快速跳转至第51次有没有问题,可以使用修改循环变量的值达到快速跳转进行调试
在这里插入图片描述


🛸跳到下一个断点

c,跳转到下一个断点


🛸跳到指定行

until n,n代表行号,跳转到指向行n
在这里插入图片描述


🛸函数调用堆栈

bt,查看函数调用堆栈(即各级函数调用及其参数)
在这里插入图片描述


http://www.dtcms.com/a/321141.html

相关文章:

  • 「iOS」————优先级反转
  • 解决Docker部署的MySQL8错误日志里面的 mbind: Operation not permitted 问题
  • 构建安全 Web 应用:从用户认证与授权到 JWT 原理解析
  • python使用python-docx自动化操作word
  • 【杂谈】-逆缩放悖论:为何更多思考会让AI变“笨“?
  • Numpy科学计算与数据分析:Numpy布尔索引与花式索引实战
  • 一种对白点进行多重加权并利用三角剖分插值微调白平衡增益的白平衡矫正算法
  • RAG问答系统:Spring Boot + ChromaDB 知识库检索实战
  • 3D Tiles 格式中,Bounding Volum
  • 基于AutoDL平台的3D_Gaussian_Splatting初体验
  • 在 Vue 中使用 ReconnectingWebSocket实现即时通讯聊天客服功能
  • 2025 前端真实试题-阿里面试题分析
  • 关于数据结构6-哈希表和5种排序算法
  • Maptalks vs Cesium
  • 【最新版】2025年搜狗拼音输入法
  • “电子合同”为什么会出现无效的情况?
  • OpenCV cv2.flip() 函数详解与示例
  • 深入理解 Java AWT Container:原理、实战与性能优化
  • ORACLE看当前连接数的方法
  • 柠檬笔试——野猪骑士
  • 南方略咨询与与清源科技正式启动国际市场GTM流程规划咨询项目!!!
  • 汽车电子:现代汽车的“神经中枢“
  • Eyevinn 彻底改变开源部署模式
  • 小孙学变频学习笔记(十三)电动机参数的自动测量 矢量控制的转速反馈
  • 如何 让ubuntu 在root 下安装的docker 在 普通用户下也能用
  • Spring Boot 结合 CORS 解决前端跨域问题
  • GitLab同步提交的用户设置
  • 2025年渗透测试面试题总结-08(题目+回答)
  • 【19】C#实战篇—— C# 绘制点划线,绘制虚线——PointF dxdy,过x点垂直画红色点划线,长度为W,过y点水平画红色点划线,长度为H
  • 华清远见25072班C语言学习day5