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

🌈 个人主页: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.rhkb.cn/news/425024.html

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

相关文章

深度剖析iOS渲染

iOS App 图形图像渲染的基本流程&#xff1a; 1.CPU&#xff1a;完成对象的创建和销毁、对象属性的调整、布局计算、文本的计算和排版、图片的格式转换和解码、图像的绘制。 2.GPU&#xff1a;GPU拿到CPU计算好的显示内容&#xff0c;完成纹理的渲染&#xff0c; 渲染完成后将渲…

界面控件DevExpress中文教程:如何PDF图形对象的可见性?

DevExpress拥有.NET开发需要的所有平台控件&#xff0c;包含600多个UI控件、报表平台、DevExpress Dashboard eXpressApp 框架、适用于 Visual Studio的CodeRush等一系列辅助工具。屡获大奖的软件开发平台DevExpress 近期重要版本v24.1已正式发布&#xff0c;该版本拥有众多新产…

STM32与ESP8266的使用

串口透传 “透传”通常指的是数据的透明传输&#xff0c;意思是在不对数据进行任何处理或修改的情况下&#xff0c;将数据从一个接口转发到另一个接口。值得注意的是要避免串口之间无限制的透明&#xff0c;可以采用互斥锁的方式进行限制使用方法 对USART1和USART3(用他俩举例…

word文档无损原样转pdf在windows平台使用python调用win32com使用pip安装pywin32

前提&#xff1a; windows环境下&#xff0c;并且安装了office套装&#xff0c;比如word,如果需要调用excel.也需要安装。在另外的文章会介绍。这种是直接调用word的。所以还原度会比较高。 需求&#xff1a; word文档转pdf,要求使用命令行形式&#xff0c;最终发布为api接口…

基于高通主板的ARM架构服务器

一、ARM架构服务器的崛起 &#xff08;一&#xff09;市场需求推动 消费市场寒冬&#xff0c;全球消费电子需求下行&#xff0c;服务器成半导体核心动力之一。Arm 加速布局服务器领域&#xff0c;如 9 月推出 Neoverse V2。长久以来&#xff0c;x86 架构主导服务器市场&#…

QTreeView模糊查询

本文代码效果如下&#xff1a; 本文代码&#xff1a; https://download.csdn.net/download/Sakuya__/89759410https://download.csdn.net/download/Sakuya__/89759410 代码之路 MainWindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #incl…

基于Ant-Design-Vue设计的配置化表单

适用vue 3.4 版本以上 在日常的前端开发中&#xff0c;表单开发必不可少&#xff0c;尤其是在遇到一些大型的复杂的表单&#xff0c;这往往会变成一个痛点。于是就想着开发一个可以list来配置的表单组件。 先上组件代码 <!-- 该组件 VUE 版本在 3.4 以上可使用--> <…

【QT】定时器使用

文章目录 关于 Qt 定时器使用的注意细节总结实例-检查工具使用周期时间是否合理UI设计头文件 remind.h源文件 remind.cpp实现效果 关于 Qt 定时器使用的注意细节总结 一、创建与初始化 使用 QTimer 类来创建定时器。可以在构造函数中指定父对象&#xff0c;确保定时器在正确的…

JavaDS —— B树

前言 本章节将带领大家进入B树的学习&#xff0c;主要介绍B树的概念和B树的插入代码的实现&#xff0c;删除代码不做讲解&#xff0c;最后简单介绍B树和B*树。 B树的概念 1970年&#xff0c;R.Bayer和E.mccreight提出了一种适合外查找的树&#xff0c;它是一种平衡的多叉树&…

【制作100个unity游戏之32】unity开发属于自己的一个2d/3d桌面宠物,可以实时计算已经获取的工资

最终效果 文章目录 最终效果一、实现Windows消息弹窗二、将窗口扩展到工作区三、穿透能点击到其他区域四、模型交互1、我们可以新增ObjectDrag 代码控制人物拖拖动2、实现模型交互五、最终代码六、其他七、游玩地址七、源码参考完结一、实现Windows消息弹窗 参考:https://lear…

WEB打点

目录 web打点概述打点流程打点中的问题getshell手法汇总web打点批量检测端口扫描POC扫描指纹识别漏洞扫描 手工检测开源框架漏洞通用框架漏洞基础web漏洞商用系统漏洞 WAF绕过waf分类常见waf拦截界面WAF绕过思路侧面绕&#xff1a;适合云WAF直面WAF web打点概述 打点流程 资产…

QT模型视图结构2

文章目录 Qt 模型视图结构——模型类(二)1.基本概念1.1.模型的基本结构1.2.模型索引1.3.行号和列号1.4.父项1.5.项的角色 Qt 模型视图结构——模型类(二) ​ 模型/视图结构是一种将数据存储和界面展示分离的编程方法。模型存储数据&#xff0c;视图组件显示模型中的数据&#…

【AI赋能医学】基于深度学习和HRV特征的多类别心电图分类

一、数据集简介 论文中使用了来自三类不同心电图记录的162条数据&#xff0c;这些数据来自三个公开的数据库&#xff1a; MIT-BIH 心律失常数据库 (ARR) 96条记录&#xff0c;主要包含不同类型的心律失常样本。 MIT-BIH 正常窦性心律数据库 (NSR) 36条记录&#xff0c;包含健…

Gitlab实现多项目触发式自动CICD

工作中可能会遇到这种场景&#xff0c;存在上游项目A和下游项目B&#xff0c;项目B的功能依赖项目A&#xff08;比如B负责日志解析&#xff0c;A是日志描述语言代码&#xff09;&#xff0c;这种相互依赖的项目更新流程一般如下&#xff1a; A项目更新&#xff0c;通知B项目开发…

Unity中InputField一些属性的理解

先看代码&#xff1a; using UnityEngine; using UnityEngine.UI;public class TestInput : MonoBehaviour {[SerializeField]InputField inputField;void Start(){Debug.Log(inputField.text);Debug.Log(inputField.text.Length);Debug.Log(inputField.preferredWidth);Debug…

2024工业机器视觉产业现状

早在20世纪80年代美国国家标准局就预计&#xff0c;检测任务的80%乃至90%将由视觉测量系统来完成&#xff0c;该预测至今已基本变成现实。当前&#xff0c;以智能制造为核心的工业4.0时代背景下&#xff0c;新型工业化的战略部署逐步深入&#xff0c;伴随AI大模型技术应用的逐步…

泰语快速学习方法!速成方法学习!

要快速学习泰语&#xff0c;可以采取多种策略&#xff0c;如掌握基础语法和词汇&#xff0c;专注于发音练习以掌握泰语特有的音调系统&#xff0c;利用语言学习软件进行互动学习&#xff0c;通过观看泰语媒体内容提高听力理解&#xff0c;与母语者进行语言交换来锻炼口语&#…

I2C/IIC学习笔记

I2C/IIC 有些同学I2C和IIC分不清&#xff0c;I2C和IIC实际上是指同一种通信协议。I2C是Inter-Integrated Circuit的缩写&#xff0c;而IIC是它的另一种表述方式&#xff0c;代表的是同一个意思&#xff0c;即“集成电路间总线”。I2C是一种由飞利浦公司&#xff08;现恩智浦半…

python AssertionError: Torch not compiled with CUDA enabled

查看&#xff1a;torch import torch# 输出带CPU&#xff0c;表示torch是CPU版本的 print(ftorch的版本是&#xff1a;{torch.__version__}) # print(ftorch是否能使用cuda&#xff1a;{torch.cuda.is_available()}) 修改一下代码&#xff0c;将cuda改成cpu 最后运行正常&…

织物缺陷检测系统源码分享

织物缺陷检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…