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

【Linux我做主】GDB调试工具完全指南

Linux下GDB调试工具完全指南:25个核心命令详解与实战示例

github地址

有梦想的电信狗

前言

GDB(GNU Debugger)Linux开发中不可或缺的调试工具,尤其在定位代码逻辑错误和内存问题时表现卓越。本文基于实际开发经验,详解25个高频GDB命令,配合场景化案例和注意事项,助你快速掌握Linux调试核心技能。


我们以该代码为例来进行gdb的演示,为了方便起见,代码中标识了行号。

  #include <stdio.h>2                                                                                                                                                  3 int addToTop(int top){4     int res =  0;5     int i = 1;6     for(; i <= top; ++i){7         res += i;8     }9     return res;10 }11 12 int main(){13     printf("debug begin\n");14     15     int top = 100;16     int sum = addToTop(top);17     18     printf("sum is : %d\n", sum);19     20     printf("debug end\n");21     return 0;22 }

准备工作

  • 程序的发布方式有两种,debug模式和release模式
  • Linux gcc/g++出来的二进制程序,默认是release模式
  • 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项
    在这里插入图片描述
  • 我们可以修改makefile中的依赖方法来进行-g编译
    在这里插入图片描述
    在这里插入图片描述
    加上-g选项后,携带有调试信息,就可以用gdb进行调试了
gdb mycode  # 开始调试该程序

1. 基础调试命令

80%的指令都是围绕定位问题产生的,打断点就是找问题的一种方式

1.1 list/l 行号

描述:从指定行号开始显示源代码(默认显示10行),接着上次的位置开始列出。
注意:需在编译时添加-g选项保留调试信息。
场景:快速定位代码上下文。

(gdb) l 0  # 从该文件的开始显示代码

在这里插入图片描述
在gdb中,默认会记录最近一次指令,因此连续回车会一直执行上一条指令。

1.2 list/l 函数名

描述:列出指定函数的完整源码。
注意:函数需在当前加载的符号表中。
场景:查看函数实现细节。

(gdb) l addToTop  # 显示addToTop函数代码
(gdb) l main  # 显示main函数代码

在这里插入图片描述


2. 断点管理

2.0 run/r

描述:从头开始执行程序,直到断点或程序结束。
注意:重复执行会重新加载程序。
场景:启动调试或重新运行程序。

(gdb) r  # 启动程序

2.1 break/b 行号

描述:在指定行设置断点。
注意:行号需在有效代码范围内。
场景:精准拦截问题发生点。

(gdb) b 15  # 在第15行设断点
(gdb) b 16  # 在第16行设断点
(gdb) b 21  # 在第21行设断点

在这里插入图片描述

2.2 break/b 函数名

描述:在函数入口设置断点。
注意:需确保函数已加载。
场景:监控特定函数调用。

(gdb) b addToTop  # 在addToTop入口暂停

在这里插入图片描述### 2.3 info break/b
描述:显示所有断点信息(编号/位置/启用状态)。
场景:查看当前断点布局。

(gdb) info b  # 显示断点列表

查看我们已设置的断点信息:
在这里插入图片描述

2.4 delete/d breakpoints/b n

我们在删除断点时,不能删除指定代码行的断点。
在我们使用info b指令时,该指令为我们的断点进行了编号,需要通过编号来删除断点。
描述:删除指定编号的断点。
注意:删除后不可恢复。
场景:清理无效断点。

(gdb) delete 1  # 删除1号断点

在这里插入图片描述

3.5 disable/enable breakpoints

有时会不想删除这个断点(因为要保留调试痕迹),但想让这个断点不工作(因为已经确认错误并不在当前断点内),因此要对断点进行使能

描述:临时禁用/启用断点。
场景:保留断点配置但不触发。

(gdb) disable 1-3  # 禁用1-3号断点
(gdb) enable 2    # 启用2号断点

在这里插入图片描述

  • enable断点指令如下
    在这里插入图片描述

3. 单步调试与流程控制

2.1 next/n

描述:单步执行(不进入函数)相当于VS下的逐过程。
注意:跳过库函数和用户函数调用。
场景:快速跳过无需深入调试的代码块。

(gdb) n  # 执行下一行

2.2 step/s

描述:单步执行(进入函数内部)。 相当于VS下的逐语句。
注意:可能跳入系统库函数(如printf)。
场景:深入分析函数内部逻辑。

(gdb) s  # 进入函数

如果代码已经是基本的C语句了,n和s没有区别,n不会跳过整个for循环

2.3 finish

描述:执行完当前函数并返回调用点。
注意:不能在main函数中使用。
场景:快速跳出复杂函数。

(gdb) finish  # 执行到函数返回
  • 进入了一个函数后,直接将该函数运行结束,直接查看该函数的运行结果,方便排除问题是否在该函数内

2.4 until X行号

until 直接运行到 x 行,跳过一定行数的代码,便于直接定位问题
描述:跳转到指定行继续执行。
注意:目标行需在当前函数内。
场景:跳过循环中的已知安全代码。

(gdb) until 30  # 跳转到30行

2.5 continue/c

描述:跳转到指定行继续执行。
注意:目标行需在当前函数内。
场景:跳过循环中的已知安全代码。

(gdb) continue 

相当于VS中的F5 从当前位置,直接运行到下一个断点处,如果中间出现了报错,那么错误就在当前范围内



4. 变量操作与堆栈分析

4.1 print/p 变量

描述:打印变量当前值。
注意:支持表达式计算。
场景:实时查看数据变化。

(gdb) p count  # 显示count值
(gdb) p arr[3] # 查看数组元素

4.2 set var

描述:修改运行中的变量值。
注意:类型需匹配。
场景:模拟异常数据测试。

(gdb) set var count=0  # 强制重置计数器

例如在循环中,i递增100次,预判到可能在第95次递增时出现问题,可以通过set var修改循环变量的值,直接跳到第95次递增的过程

4.3 display 变量

描述:持续跟踪变量(每次暂停自动显示)。
场景:监控关键变量变化趋势。

(gdb) display total  # 持续显示total变量

display后左侧会有变量编号,undisplay取消变量跟踪时,后面需要跟左侧显示的变量编号

4.4 info locals

查看当前函数栈内的局部变量
描述:显示当前栈帧的所有局部变量。
场景:快速查看函数内部状态。

(gdb) info locals  # 列出当前函数局部变量

5. 高级调试技巧

5.1 backtrace/bt

查看各级函数的互相调用关系和传参情况

描述:显示函数调用栈(含参数)。
场景:分析崩溃时的调用链路。

(gdb) bt  # 显示调用堆栈

5.2 frame N

描述:切换到指定堆栈帧(配合bt使用)。
场景:查看上级调用者上下文。

(gdb) frame 2  # 查看第二层栈帧

5.3 watch 变量

描述:设置数据观察点(变量修改时暂停)。
注意:仅对特定内存地址生效。
场景:定位意外修改问题。

(gdb) watch *0x7fffffffe234  # 监控内存地址

结语

不要认为gdb或VS等调试工具很先进,思考代码逻辑或者printf信息也是调试方法,只要能快速方便的定位并解决问题,都是好方法

掌握GDB调试技能是Linux开发者的核心能力之一。本文涵盖的25个命令已覆盖90%日常调试场景,建议结合真实项目实践加深理解。欢迎在评论区交流实战经验!

以上就是本文的所有内容了,如果觉得文章写的不错,还请留下免费的赞和收藏,也欢迎各位大佬在评论区交流
分享到此结束啦
一键三连,好运连连!

相关文章:

【Linux我做主】GDB调试工具完全指南

Linux下GDB调试工具完全指南&#xff1a;25个核心命令详解与实战示例 github地址 有梦想的电信狗 前言 GDB&#xff08;GNU Debugger&#xff09;是Linux开发中不可或缺的调试工具&#xff0c;尤其在定位代码逻辑错误和内存问题时表现卓越。本文基于实际开发经验&#xff0…...

Pycharm 如何删除某个 Python Interpreter

在PyCharm中&#xff0c;点击右下角的“Interpreter Settings”按钮&#xff0c;或者通过菜单栏选择“File” > “Settings”&#xff08;macOS用户选择“PyCharm” > “Preferences”&#xff09;。在设置窗口中&#xff0c;导航到“Project: [Your Project Name]” >…...

在 Debian 12 中恢复被删除的 smb.conf 配置文件

https://forum.ubuntu.com.cn/viewtopic.php?t494763 本文结合ai输出&#xff0c;内容中可能有些错误&#xff0c;但确实解决了我的问题&#xff0c;我采取保留完整输出的方式摘录。 在 Debian 12 中恢复被删除的 smb.conf 配置文件&#xff0c;需结合 dpkg 和 ucf&#xff08…...

Day3:个人中心页面布局前端项目uniapp壁纸实战

接下来我们来弄一下个人中心页面布局user.vue <template><view class"userLayout"><view class"userInfo"><view class"avatar"><image src"../../static/Kx.jpg" mode"aspectFill"></im…...

访问”和“初始化本质区别以及C++静态成员变量定义位置详解

&#x1f4a1; 1.访问”和“初始化本质区别&#xff1a; ✅ 访问 protectedNum&#xff1a;Derived 作为 Base 的子类&#xff0c;是可以在自己的函数中访问 protectedNum 的。❌ 初始化 protectedNum&#xff1a;只能通过 Base 的构造函数来初始化&#xff0c;因为它是 Base …...

正则表达式反向引用的综合应用魔法:从重复文本到简洁表达的蜕变

“我....我要....学学学学....编程 java!” —— 这类“重复唠叨”的文本是否让你在清洗数据时头疼不已&#xff1f; 本文将带你一步步掌握正则表达式中的反向引用技术&#xff0c;并结合 Java 实现一个中文文本去重与清洗的实用工具。 结合经典的结巴实例。如何高效地将这样的…...

C实现md5功能

md5在线验证&#xff1a; 在线MD5计算_ip33.com 代码如下&#xff1a; #include "md5.h" #include <string.h> #include "stdio.h"/** 32-bit integer manipulation macros (little endian)*/ #ifndef GET_ULONG_LE #define GET_ULONG_LE(n,b,i) …...

FFmpeg+Nginx+VLC打造M3U8直播

一、视频直播的技术原理和架构方案 直播模型一般包括三个模块&#xff1a;主播方、服务器端和播放端 主播放创造视频&#xff0c;加美颜、水印、特效、采集后推送给直播服务器 播放端&#xff1a; 直播服务器端&#xff1a;收集主播端的视频推流&#xff0c;将其放大后推送给…...

在 Debian 10.x 安装和配置 Samba

1. 更新系统 sudo apt update sudo apt upgrade -y2. 安装 Samba sudo apt install samba -y3. 配置 Samba 备份默认配置文件 sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak编辑配置文件 sudo nano /etc/samba/smb.conf示例配置&#xff08;共享目录&#xff09; …...

基础(测试用例:介绍,测试用例格式,案例)

目录 测试用例介绍 测试用例编写格式 案例 测试用例介绍 用例&#xff1a;用户使用软件的案例场景 测试用例&#xff1a;是为测试项目而设计的测试执行文档 测试用例的作用&#xff1a; 防止漏测是实施测试的标准可以作为测试工作量的评估 测试用例编写格式 用例编号 用例…...

C++学习:六个月从基础到就业——内存管理:RAII原则

C学习&#xff1a;六个月从基础到就业——内存管理&#xff1a;RAII原则 本文是我C学习之旅系列的第十九篇技术文章&#xff0c;也是第二阶段"C进阶特性"的第四篇&#xff0c;主要介绍C中的RAII原则及其在资源管理中的应用。查看完整系列目录了解更多内容。 引言 在…...

Windows串口通信

Windows串口通信相比较Android串口通信,在开发上面相对方便一些。原理都是一样,需要仔细阅读厂商设备的串口通信协议。结合串口调试助手进行测试,测试通过后,编写代码实现。 比如近期就接触到了一款天平,其最大测量值为100g,测量精度0.001g。 拿到手之后我就先阅读串口通…...

bert项目解析

数据预处理 读取csv数据集 def read_file(file_path):data []label []with open(file_path, "r", encoding"utf-8") as file:reader csv.reader(file)next(reader) # 跳过标题行# row每一行用英文逗号分割成列表[标签,文本] 所以标签和文本用英文逗…...

Linux `init` 相关命令的完整使用指南

Linux init 相关命令的完整使用指南—目录 一、init 系统简介二、运行级别&#xff08;Runlevel&#xff09;详解三、常用 init 命令及使用方法1. 切换运行级别2. 查看当前运行级别3. 服务管理4. 紧急模式&#xff08;Rescue Mode&#xff09; 四、不同 Init 系统的兼容性1. Sy…...

【开源项目】Excel手撕AI算法深入理解(三):时序(RNN、mamba、Long Short Term Memory (LSTM)、xLSTM)

项目源码地址&#xff1a;https://github.com/ImagineAILab/ai-by-hand-excel.git 一、RNN 1. RNN 的核心思想 RNN 的设计初衷是处理序列数据&#xff08;如时间序列、文本、语音&#xff09;&#xff0c;其核心特点是&#xff1a; 隐藏状态&#xff08;Hidden State&#xff…...

嵌入式音视频开发指南:从MPP框架到QT实战全解析

嵌入式音视频开发指南:从MPP框架到QT实战全解析 一、音视频技术全景概述 1.1 技术演进里程碑 2003-2010年:标清时代(H.264/AVC + RTMP)2011-2018年:高清时代(H.265/HEVC + WebRTC)2019-至今:智能时代(AV1 + AI编解码 + 低延迟传输)1.2 现代音视频技术栈 #mermaid-s…...

构建专业金融图表系统的高效路径——QtitanChart在金融行业的应用价值

QtitanChart是一个C 库&#xff0c;它代表一组控件&#xff0c;这些控件使您可以快速轻松地为应用程序提供漂亮而丰富的图表。QtitanChart在Qt.C 上实现&#xff0c;并且支持所有主要的桌面操作系统 - Windows、Linux和Mac OSX。要将QtitanChart添加到您的程序中&#xff0c;只…...

如何通过window端来ssh连接本地虚拟机的ubuntu

首先在 Ubuntu 虚拟机上安装和配置 SSH 服务&#xff1a; # 安装 SSH 服务器 sudo apt update sudo apt install openssh-server# 检查 SSH 服务状态 sudo systemctl status ssh# 如果没有启动&#xff0c;则启动 SSH 服务 sudo systemctl start ssh# 设置开机自启动 sudo sys…...

问题:el-tree点击某节点的复选框由半选状态更改为全选状态以后,点击该节点展开,懒加载出来子节点数据以后,该节点又变为半选状态

具体问题场景&#xff1a; 用户点击父节点复选框将其从半选变为全选&#xff08;此时子节点尚未加载&#xff09;。 点击节点展开触发懒加载&#xff0c;加载子节点。 子节点加载后&#xff0c;组件重新计算父节点状态&#xff0c;发现并非所有子节点被选中&#xff0c;因此父节…...

【Rust 精进之路之第8篇-工具赋能】深入 Cargo:依赖管理、构建配置与工作空间 (Workspace)

系列: Rust 精进之路:构建可靠、高效软件的底层逻辑 作者: 码觉客 发布日期: 2025-04-20 引言:超越构建,Cargo 是 Rust 生态的引擎 在我们的 Rust 学习之旅初期(第二篇),我们已经与 Cargo 有过初步的接触。我们学会了使用 cargo new 创建项目骨架,用 cargo build 编…...

多模态大语言模型arxiv论文略读(二十六)

Holistic Autonomous Driving Understanding by Bird’s-Eye-View Injected Multi-Modal Large Models ➡️ 论文标题&#xff1a;Holistic Autonomous Driving Understanding by Bird’s-Eye-View Injected Multi-Modal Large Models ➡️ 论文作者&#xff1a;Xinpeng Ding,…...

Java虚拟机(JVM)平台无关?相关?

计算机的概念模型 计算机实际上就是实现了一个图灵机模型。即&#xff0c;输入参数&#xff0c;根据程序计算&#xff0c;输出结果。图灵机模型如图。 Tape是输入数据&#xff0c;Program是针对这些数据进行计算的程序&#xff0c;中间横着的方块表示的是机器的状态。 目前使…...

Ubuntu 安装 Docker 教程(官方推荐方式)

✅ 步骤 1&#xff1a;卸载旧版本&#xff08;如果有&#xff09; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done---### ✅ 步骤 2&#xff1a;更新 APT 索引并安装依赖项bash sudo a…...

Win10 C盘空间不足清理方法

当Windows 10系统的C盘空间不足时&#xff0c;可以采取以下方法进行清理&#xff1a; 1. 清理临时文件 打开“设置” > “系统” > “存储”。 点击“临时文件”&#xff0c;勾选要删除的临时文件、系统缓存等&#xff0c;然后点击“删除文件”。 2. 使用磁盘清理工具…...

cloudstudio学习笔记之openwebui

代码获取 git clone 参考资料 openwebui官网 https://docs.openwebui.com/getting-started/advanced-topics/development 后端启动 cd backend pip install -r requirements.txt -U sh dev.sh后端启动成功后的界面 在cloudstudio提供的vscode弹出的提示中打开浏览器并在末…...

7.QT-常用控件-QWidget|font|toolTip|focusPolicy|styleSheet(C++)

font API说明font()获取当前widget的字体信息.返回QFont对象.setFont(const QFont& font)设置当前widget的字体信息. 属性说明family字体家族.⽐如"楷体",“宋体”,"微软雅⿊"等.pointSize字体⼤⼩weight字体粗细.以数值⽅式表⽰粗细程度取值范围为[…...

机器学习核心算法全解析:从基础到进阶的 18 大算法模型

在机器学习领域&#xff0c;算法模型是解决实际问题的核心工具。 不同的算法适用于不同的数据场景和任务需求&#xff0c;理解它们的原理与应用是掌握机器学习的关键。 以下将详细解析 18 个核心算法模型&#xff0c;涵盖监督学习、无监督学习、集成学习和深度学习等多个领域…...

线性代数 | 知识点整理 Ref 1

注&#xff1a;本文为 “线性代数 | 知识点整理” 相关文章合辑。 因 csdn 篇幅合并超限分篇连载&#xff0c;本篇为 Ref 1。 略作重排&#xff0c;未整理去重。 图片清晰度限于引文原状。 如有内容异常&#xff0c;请看原文。 线性代数知识汇总 Arrow 于 2016-11-27 16:27:5…...

【深度学习入门_NLP自然语言处理】序章

本部分开始深度学习第二大部分NLP章节学习&#xff0c;找了好多资料&#xff0c;终于明确NLP的学习目标了&#xff0c;介于工作之余学习综合考量&#xff0c;还是决定以视频学习为主后期自主实践为主吧。 分享一个总图&#xff0c;其实在定位的时候很迷茫&#xff0c;单各章节…...

Windows常用维护命令

系统信息查询 systeminfo&#xff1a;查看系统详细信息&#xff0c;如操作系统版本、处理器信息、内存配置等。hostname&#xff1a;显示计算机名称。ver&#xff1a;显示 Windows 版本。 网络诊断 ipconfig&#xff1a;查看 IP 配置&#xff0c;如 IP 地址、子网掩码、网关等。…...