【Linux】精通GDB:打造你的Linux调试超能力

news2024/9/20 14:56:55

🌈 个人主页:Zfox_
🔥 系列专栏:C++从入门到精通

目录

  • 一: 🔥 什么是GDB / CGDB
  • 二: 🔥 CGDB的安装
    • 🍊 Linux-centos
  • 三: 🔥 cgdb的使用背景
    • 🥝 下面是Makefile中的内容,用于自动化编译:
  • 四: 🔥 CGDB调试代码----指令学习📚
    • 🥝 生成调试文件
    • 🥝 指令集汇总
    • 🥝 指令演示
  • 五: 🔥 总结
  • 六: 🔥 共勉

一: 🔥 什么是GDB / CGDB

💦 GDB Linux下非常好用且强大的调试工具GDB 允许开发者在程序运行时检查其内部状态、控制程序的执行流程,并帮助定位和解决程序中的错误(bug)。

💦 CGDB是一款轻量级的基于GDB的命令行可视化工具,在终端窗口中以图形化的形式来调试代码,非常方便。相对于GDB来说,可以很大的提高效率

二: 🔥 CGDB的安装

🍊 Linux-centos

  • 💦 检查机器上是否安装了 cgdb
[root@hcss-ecs-a9ee ~]# cgdb --version
-bash: cgdb: command not found
  • 💦 出现像上⾯的结果,Linux会友好地告诉你 cgdb 没有安装。
    安装 cgdb:
sudo yum install -y cgdb

三: 🔥 cgdb的使用背景

  • 程序的发布方式有两种,debug模式和 release 模式。
  • Linux gcc/g++出来的二进制程序,默认是release模式。
  • 要使用cgdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项。

🥝 下面是Makefile中的内容,用于自动化编译:

1 myexe:code.c
2     gcc -o $@ $^ -std=c99 -g                                                                                                                                                                                                                                                  
3 .PHONY:clean
4 clean:
5     rm -f myexe

四: 🔥 CGDB调试代码----指令学习📚

💢 下面是本次调试所要使用到的代码:

#include <stdio.h>

int Sum(int s, int e)
{
    int sum = 0;
    int i = s;
    for(; i <= e; i++)
    {
        sum += i;
    }
    return sum;
}

int main()
{
    printf("process is running\n");

    
    int start = 1;
    int end = 100;
    int result = Sum(start, end);
    printf("process is done, result: %d\n", result);
    return 0;
}

🥝 生成调试文件

不调试的情况下,使用 gcc 指令编译文件一般是:gcc test.c -o test 但是,如果要调试,那么就必须要加上 -g 指令。其原理用 Visual Studio Code 环境下来类比,使用该 IDE 熟悉的话便知道 发行一个程序的时候,可以有 release 版本和 debug 版本,只有我们选择 debug 版本的时候,程序才可以被调试,否则不行。这里也类似,加上 -g 就相当于生成 debug 版本的程序,不加就默认是 release 版本的。其正确指令如下:

gcc test.c -o test -g -std=c99

🥝 指令集汇总

  • 💦 指令集汇总
    因为这个调试器是在Linux环境下的,是纯命令行模式,所以会有很多的指令。

💢 注:()括号里面是该指令的全称

名字描述
l(list) 行号/函数名显示对应的code,每次10行
r(run)F5【无断点直接运行、有断点从第一个断点处开始运行】
b(breakpoint) + 行号在哪一行打断点
b 源文件:函数名在该函数的第一行打上断点
b 源文件:行号在该源文件中的这行加上一个断点
info b查看断点的信息
breakpoint already hit 1 time【此断点被命中一次】
d(delete) + 当前要删除断点的编号删除一个断点【不可以d + 行号】
若当前没有跳出过gdb则断点的编号会持续累加
d + breakpoints删除所有的断点
disable b(breakpoints)使所有断点无效【默认缺省】
enable b(breakpoints)使所有断点有效【默认缺省】
disable b(breakpoint) + 编号使一个断点无效【禁用断点】
enable b(breakpoint) + 编号使一个断点有效【开启断点】
enable breakpount使一个断点有效【开启断点】
n(next)逐过程【相当于F10】
s(step)逐语句【相当于F11】
bt看到底层函数调用的过程【函数压栈】
set var修改变量的值
p(print) 变量名打印变量值
display跟踪查看一个变量,每次停下来都显示它的值【变量/结构体…】
undisplay + 变量名编号取消对先前设置的那些变量的跟踪
  • 💦 排查问题三剑客🗡
名字描述
until + 行号进行指定位置跳转,执行完区间代码
finish在一个函数内部,执行到当前函数返回,然后停下来等待命令
c(continue)从一个断点处,直接运行至下一个断点处【VS下不断按F5】

🥝 指令演示

[lisi@hcss-ecs-a9ee lesson9]$ ls
code.c  Makefile  myexe
[lisi@hcss-ecs-a9ee lesson9]$ cgdb myexe
  • 首先我们进入到 cgdb,然后它会等待我们输入指令
    在这里插入图片描述
    ✨行号显示

l(list) 行号/函数名 —— 显示对应的code,每次10行

首先若是直接【L】的话便会显示出该源文件中的10行内容,这不是我们想要的。

[?1034h[?1034hGNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/lisi/112/lesson9/myexe...done.
(gdb) l
23          printf("process is running\n");
24
25
26          int start = 1;
27          int end = 100;
28          int result = Sum(start, end);
29          printf("process is done, result: %d\n", result);
30          return 0;
31	}
(gdb) 

若是【L 0】或者是【L 1】的话那就是从第一行开始往下列10行的内容
注意这里的L是小写,而且与数字之间要有一个空格

(gdb) L	0
1	#include <stdio.h>
2
3
4	int Sum(int s, int e)
5	{
6           int sum = 0;
7           int i = s;
8           for(; i <= e; i++)
9           {
10              sum += i;
(gdb) 
  • 接下去若是想要看到我们所写的全部代码,只需要多Enter几次就可以了,cgdb会自动记忆你上次敲入的指令。

其他指令也是如此,大家多多实验即可

五: 🔥 总结

最后来总结一下本文所学习的内容📖

  • gcc/g++ 而言默认生成的可执行程序就是 【Release】 版本的,因此我们要加上一个 -g 命令选项使其在make之后生成一个 【DeBug】 版本的可执行程序,这样就可以进行调试了。
  • 接着我们正式进入到了调试器 CGDB 的使用,介绍了很多相关的指令,这些都是我整理出来的常见指令,其实对于 CGDB 来说还有很多指令,但是真正常用的也就这些,只要你认真地看下来,将它们都使用熟练了,相信你的调试功底会大幅度提升,对你在 VS 中的调试也是有所帮助的。
  • 最后,在学习了 CGDB 的许多调试指令后,我们便进行了 【Swap Two Numbers】 的实战演练,不仅巩固了C语言中有关传址调用以及函数栈帧的相关指知识,而且使我们对于调试器 CGDB 的使用更上一层楼↑。

六: 🔥 共勉

以上就是我对 【Linux】精通GDB 的理解,觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~😉
在这里插入图片描述

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

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

相关文章

vmware,centos8(虚拟机) 的安装

安装vmware 点击下方网址 虚拟机安装地址https://www1.msc23.cn/vm/?bd_vid8829610582362807097选择VMware17 打开文件所在地&#xff0c;双击安装 同意条款 选择安装位置 不将VMware配置到环境变量path 不检查更新,不加入客户体验 创建桌面快捷方式 开始安装 安装完成…

47.面向对象综合训练-汽车

//题目需求&#xff1a;定义数组存储3个汽车对象 //汽车的属性&#xff1a;品牌&#xff0c;价格&#xff0c;颜色 //创建三个汽车对象&#xff0c;数据通过键盘录入而来&#xff0c;并把数据存入到数组当中 1.标准的JavaBean类 public class Car {private String brand;//品…

基于yolov8的谢韦尔钢材缺陷检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的谢韦尔钢材缺陷检测系统&#xff0c;充分利用了YOLOv8算法的高效性和准确性&#xff0c;为钢材表面缺陷检测提供了先进的解决方案。该系统通过深度学习技术&#xff0c;特别是YOLOv8这一实时目标检测算法&#xff0c;能够快速、准确地识别钢材表面的…

【Linux进程】Linux Shell编程实战:构建简易脚本示例与技巧详解

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;Linux “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;暂无 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀Linux进程 &#x1f4d2;1. 获取输入&…

《Nginx核心技术》第17章:使用自签CA配置HTTPS加密反向代理访问

作者&#xff1a;冰河 星球&#xff1a;http://m6z.cn/6aeFbs 博客&#xff1a;https://binghe.gitcode.host 文章汇总&#xff1a;https://binghe.gitcode.host/md/all/all.html 星球项目地址&#xff1a;https://binghe.gitcode.host/md/zsxq/introduce.html 沉淀&#xff0c…

事务方法中存在远程调用

1. 背景 在实现下单的方法中&#xff0c;首先通过远程调用查询了地址簿信息和服务信息等&#xff0c;然后将这些信息和前端传入的预约时间、服务项等信息封装到order实体类&#xff0c;然后调用Mybatis-Plus提供的ServiceImpl类的save方法&#xff0c;向数据库表中插入数据。 …

基于51单片机的220V交流数字电流表proteus仿真

地址&#xff1a;https://pan.baidu.com/s/1QmpPLvDTuW7QG7P-JCLPPg 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectron…

直流无刷电机霍尔线序自学习解释

直流无刷电机霍尔线序自学习 步骤详解 1. 初始连接 连接电机的三相线&#xff1a;A、B、C。连接霍尔传感器线&#xff1a;HA、HB、HC。 2. 输入电压组合与霍尔信号记录 电机的电压输入组合和霍尔信号记录是电机控制系统中至关重要的一部分&#xff0c;它们决定了电机的运转…

CODESYS标准化编程之输入输出映射

在介绍输入输出映射之前大家需要了解开关量防抖滤波功能块,相关链接如下: 开关量防抖滤波器(梯形图和SCL源代码)_开关量输入滤波程序-CSDN博客文章浏览阅读724次。本文介绍了开关量防抖滤波器的原理和应用,包括梯形图和SCL源代码的实现。通过防抖滤波功能块,可以有效滤除低…

2024年9月15日

30min 1.配置数据库得到数据表 2.连接数据库 英语六级 遇到了报错

YOLOv10改进系列,YOLOv10颈部网络SPPF替换为FocalModulation

摘要 焦点调制网络(简称FocalNets),其中自注意力(SA)完全由焦点调制模块取代,用于在视觉中建模标记交互。焦点调制包括三个组件:(i)焦点情境化,通过一堆深度卷积层实现,从短到长范围编码视觉上下文,(ii)门控聚合,选择性地将上下文聚集到每个查询标记的调制器中…

OpenCV和Tesseract OCR识别复杂验证码喽~~

目录 代码实现思路 流程&#xff1a; 主要流程&#xff1a; 整体代码 效果展示 原图 处理之后的图 总结 流程图 代码实现思路 使用 OpenCV 进行图像预处理&#xff0c;并通过 Tesseract OCR 来识别验证码中的字符。以下是其实现思路的详细讲解&#xff1a; 流程&…

人工免疫算法(AIS算法)求解实例---旅行商问题 (TSP)

目录 一、采用AIS求解 TSP二、 旅行商问题2.1 实际例子&#xff1a;求解 6 个城市的 TSP2.2 **求解该问题的代码**2.3 代码运行过程截屏2.4 代码运行结果截屏&#xff08;后续和其他算法进行对比&#xff09; 三、 如何修改代码&#xff1f;3.1 减少城市坐标&#xff0c;如下&a…

【AIGC cosplay】让大模型扮演求职者,我当hr来面试

【AIGC cosplay】让大模型扮演求职者&#xff0c;我当hr来面试 背景前摇&#xff08;省流可不看&#xff09;&#xff1a; 工位附近有几位人力资源的老师&#xff0c;我发现他们这个职位可以看到好多别人的简历&#xff0c;还能跟好多人聊天&#xff0c;完事了跟同事悄悄吐槽…

<<编码>> 第 12 章 二进制加法器--8位加法器 示例电路

8 位加法器内部结构 info::操作说明 鼠标单击逻辑输入切换 0|1 状态 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/code-hlchs-examples/assets/circuit/code-hlchs-ch12-08-8-bit-adder-internal.txt 8 位加法器 info::操作说…

操作系统——OS概述

操作系统——OS概述 操作系统概念 操作系统&#xff08;Operation System&#xff0c;OS&#xff09;是管理计算机硬件与软件资源的计算机程序。由此来看&#xff0c;OS是一种特殊的软件&#xff0c;它给用户和其他软件提供接口和环境&#xff0c;是计算机系统中最基本的系统…

20、Cereal

难度 高 目标 root 权限 2 Flag 使用VMware进行运行 信息收集 kali 192.168.152.56 靶机 192.168.152.65 第一次遇到这么快的端口扫描 可以看到存在ftp anoymous访问 同时还有大量的tcpwrapped状态&#xff0c;这个状态我还没见过 另外有个数据库和两个我网站服务&#xf…

4.TensorBoard的使用(一)--add_scalar()

Tensorboard的使用&#xff08;一&#xff09; TensorBoard 是一个可视化工具&#xff0c;用于监控和调试深度学习模型的训练过程。 1.使用add_scalar()进行简单绘图 首先需要导入Tensorboard包 from torch.utils.tensorboard import SummaryWriter创建一个SummaryWriter类的…

深入理解SpringBoot(一)----SpringBoot的启动流程分析

1、SpringApplication 对象实例化 SpringApplication 文件 public static ConfigurableApplicationContext run(Object[] sources, String[] args) {// 传递的source其实就是类Bootstrapreturn new SpringApplication(sources).run(args);// 实例化一个SpringApplication对象执…

CSS—4

1.定位 1.相对定位 2.绝对定位 3.固定定位 4.粘性定位 5.定位的特殊应用 2.布局-版心 3.布局-常用布局名词 4.布局-重置默认样式