【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%日常调试场景,建议结合真实项目实践加深理解。欢迎在评论区交流实战经验!

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/77738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT中栅格模式探索

1、Qt中选择了栅格模式&#xff0c;如下图所示&#xff1a; 2、在进行整个大的UI界面布局时&#xff0c;需了解每个控件所需要选择的属性sizePolicy。 sizePolicy包含如下几种选择&#xff1a; 3、举个例子&#xff1a;此时整个UI界面&#xff0c;我采用了栅格模式&#xf…

【计算机网络】3数据链路层①

这篇笔记专门讲数据链路层的功能。 2.功能 数据链路层的主要任务是让帧在一段链路上或一个网络中传输。 2.1.封装成帧(组帧) 解决的问题:①帧定界②帧同步③透明传输 实现组帧的方法通常有以下种。 2.1.1.字符计数法 原理:在每个帧开头,用一个定长计数字段来记录该…

[区块链lab2] 构建具备加密功能的Web服务端

实验目标&#xff1a; 掌握区块链中密码技术的工作原理。在基于Flask框架的服务端中实现哈希算法的加密功能。 实验内容&#xff1a; 构建Flash Web服务器&#xff0c;实现哈希算法、非对称加密算法的加密功能。 实验步骤&#xff1a; 哈希算法的应用&#xff1a;创建hash…

蓝桥杯之前缀和

一维前缀 解题思路 看到“区间之和”问题&#xff0c;直接想到“前缀和” 前缀和的核心公式&#xff1a; sum[i]sum[i−1]a[i] 利用前缀和求区间和 [l,r] 的公式&#xff1a; 区间和sum[r]−sum[l−1] 解题步骤模板 输入数组&#xff1a; 读取数组长度 n 和查询次数 m。 读…

【学习笔记】计算机网络(八)—— 音频/视频服务

第8章 互联网上的音频/视频服务 文章目录 第8章 互联网上的音频/视频服务8.1概述8.2 流式存储音频/视频8.2.1 具有元文件的万维网服务器8.2.2 媒体服务器8.2.3 实时流式协议 RTSP 8.3 交互式音频/视频8.3.1 IP 电话概述8.3.2 IP电话所需要的几种应用协议8.3.3 实时运输协议 RTP…

【WRF运行】解决metgrid生成文件太大无内存!

目录 方法:改变工作目录运行 metgrid.exe参考由于我的运行内存过小,当研究区较大时,metgrid生成文件内存太大,导致每次运行都报错,此时可更改工作目录(空余文件夹)以运行 metgrid.exe(并非必须在wrf安装目录下运行!!!)。 metgrid.exe 本身不支持直接通过参数或 nam…

基于 Django 进行 Python 开发

基于 Django 进行 Python 开发涉及多个方面的知识点,以下为你详细介绍: 1. Django 基础 项目与应用创建 借助django-admin startproject project_name来创建新的 Django 项目。利用python manage.py startapp app_name创建新的应用。项目结构 理解项目各文件和目录的作用,像…

【sylar-webserver】8 HOOK模块

文章目录 知识点HOOK实现方式非侵入式hook侵入式hook ⭐⭐⭐ 覆盖系统调用接口获取被全局符号介入机制覆盖的系统调用接口 具体实现C 模板成员函数继承 和 成员函数指针类型匹配 ⭐⭐⭐⭐⭐FdCtx 和 FdManager ⭐⭐判断socket的小技巧FdCtxFdManager connect hook ⭐do_io模板 …

SpringAI+DeepSeek大模型应用开发——1 AI概述

AI领域常用词汇 LLM&#xff08;LargeLanguage Model&#xff0c;大语言模型&#xff09; 能理解和生成自然语言的巨型AI模型&#xff0c;通过海量文本训练。例子&#xff1a;GPT-4、Claude、DeepSeek、文心一言、通义干问。 G&#xff08;Generative&#xff09;生成式: 根据上…

SpringBoot 基本原理

SpringBoot 为我们做的自动配置&#xff0c;确实方便快捷&#xff0c;但一直搞不明白它的内部启动原理&#xff0c;这次就来一步步解开 SpringBoot 的神秘面纱&#xff0c;让它不再神秘。 目录 SpringBootApplication 背后的秘密 Configuration ComponentScan EnableAutoC…

2025.4.17总结

工作&#xff1a;今天对需求的测试设计进行了完善&#xff0c;然后&#xff0c;对测试设计进行了评审&#xff0c;最后提了个问题单。 反思这个过程&#xff0c;要说不足的地方&#xff0c;就是评审的时候总觉得自己吐字不清晰&#xff0c;表达能力早就想提升了&#xff0c;但…

2021-11-14 C++三七二十一数

缘由c编程怎么写&#xff0c;紧急求解-编程语言-CSDN问答 void 三七二十一数() {//缘由https://ask.csdn.net/questions/7566632?spm1005.2025.3001.5141int n 0, a 0, b 0, p 1;std::cin >> n;while (n--){std::cin >> a >> b;while (a<b){if (a %…

大模型面经 | DeepSpeed中ZeRO-1、ZeRO-2和ZeRO-3的区别是什么?

大家好,我是皮先生!! 今天给大家分享一些关于大模型面试常见的面试题,希望对大家的面试有所帮助。 往期回顾: 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题一) 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题二) 大模型面经 | 春招、秋招算法…

spring boot 文件上传

1.编写文件上传的表单页面 <!DOCTYPE html> <html lang"en" xmlns:th"http://www.thymeleaf.org"> <head><meta charset"UTF-8"><meta http-equiv"Content-Type" content"text/html; charsetUTF-8&qu…

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

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

5G网络切片:精准分配资源,提升网络效率的关键技术

5G网络切片&#xff1a;精准分配资源&#xff0c;提升网络效率的关键技术 随着5G技术的广泛应用&#xff0c;网络切片&#xff08;Network Slicing&#xff09;作为其核心创新之一&#xff0c;正在改变传统网络架构。它通过将物理网络划分为多个逻辑网络&#xff08;切片&…

Spring Boot中Excel处理完全指南

文章目录 1. Excel处理基础知识1.1 为什么需要在应用中处理Excel文件&#xff1f;1.2 Java中的Excel处理库介绍1.2.1 Apache POI1.2.2 EasyExcel1.2.3 JExcel1.2.4 Apache POI SXSSF 1.3 Spring Boot中集成Excel处理 2. 在Spring Boot中集成Excel处理库2.1 集成Apache POI2.1.1…

Elasticsearch 8.18 中提供了原生连接 (Native Joins)

作者&#xff1a;来自 Elastic Costin Leau 探索 LOOKUP JOIN&#xff0c;这是一条在 Elasticsearch 8.18 的技术预览中提供的新 ES|QL 命令。 很高兴宣布 LOOKUP JOIN —— 这是一条在 Elasticsearch 8.18 的技术预览中提供的新 ES|QL 命令&#xff0c;旨在执行左 joins 以进行…

2025年渗透测试面试题总结-拷打题库03(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 2025年渗透测试面试题总结-拷打题库03 一、Windows与Linux系统提权思路 Windows提权 Linux提权 二、…

【华为】OSPF震荡引起CPU占用率高怎么解决?

原创&#xff1a;厦门微思网络 现象描述 如图所示&#xff0c;Switch_1、Switch_2、Switch_3和Switch_4配置了OSPF协议&#xff0c;发现Switch_1设备的CPU占用率高&#xff0c;ROUT任务占用率明显高于其他任务并且产生路由震荡。 故障组网图 原因分析 网络中IP地址冲突导致…