【探索 GDB 和 CGDB】:强大的调试工具介绍

news2024/11/17 7:48:30

📃个人主页:island1314

🔥个人专栏:Linux—登神长阶

⛺️ 欢迎关注:👍点赞 👂🏽留言 😍收藏  💞 💞 💞


1. 引言📃

1.1 什么是GDB / CGDB?

🚀GDB(GNU Debugger)是 GNU 项目提供的一种调试工具,用于调试 C、C++ 和其他编程语言编写的程序。它允许程序员查看和控制程序的执行,从而帮助找到和修复程序中的错误。

🚀CGDB 是 GDB 的一个前端,它提供了一个更为用户友好的命令行界面,结合了文本用户界面(TUI)和普通的命令行。CGDB 提供了更加直观的视图和界面,使得调试过程更为高效。

1.2 两者各自的功能

【GDB 的主要功能】

  1. 启动程序:可以在 GDB 中启动程序,设置参数和环境变量。
  2. 设置断点:允许用户在程序中的特定位置设置断点,以便程序执行到该位置时暂停。
  3. 单步调试:可以逐行执行代码,观察每一步的行为和变量的变化。
  4. 查看和修改变量:可以查看程序中的变量值,也可以在调试过程中修改这些变量。
  5. 调用栈跟踪:可以查看当前的调用栈,帮助识别程序执行路径。
  6. 后退调试:支持在某些情况下“后退”执行,以帮助分析错误。
  7. 脚本和自动化:支持通过脚本进行自动化调试,便于重复调试相似的问题。

【CGDB 的主要功能】

  1. 图形化用户界面:提供了一个可视化的界面,使得调试过程更为直观。
  2. 命令窗口与文本窗口结合:可以在同一界面中查看代码和 GDB 命令的输出,提高调试效率。
  3. 多窗口支持:支持多个窗口,使得同时查看代码、变量和命令输出变得容易。
  4. 快捷键支持:提供了多种快捷键来快速执行常用操作,提升使用体验。

1.3 如何安装

-- 安装gdb/cgdb
sudo yum install -y gdb 
sudo yum install -y cgdb

-- 检查是否安装成功
gdb --version
cgdb --version

2. GDB / CGDB 的使用 

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

🥑 代码案例

下面是我们这次调式需要使用代码:

#include <stdio.h>

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

int div(int x, int y){
    if(y == 0) return -1;
    int z = x / y;
    return z;
}

int main()
{
    printf("process is running ");
    int start = 1;
    int end = 10;
    int result = sum(start, end);
    printf("process is done, result: %d\n",result);
    
    int a =  div(10, 0);
    printf("process is done, result: %d\n",a);

    return 0;
}

🥝 生成调试文件

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

方式一:

方式二:

🍊可以看到的是,debug版本的可执行程序test.d明显比release版本test.r的大。

方式三:

为了方便,我们还是把调式代码指令写到Makefile 文件中。上面的test.r 和 test.d 的调式版本只是给大家看一下,下面我们不做过多区分,统一用 test 可执行文件来替代。

test:test.c
	gcc -o $@ $^ -g -std=c11

.PHONY:clean
clean:
	rm -f test

🥑 readelf命令

🍊我们可以通过readelf指令来查看可执行文件中有没有调试信息。

3. 调式指令📚

3.1 指令集

💢 gdb binFile 退出: ctrl + d 或 quit 调试命令:

指令名作用

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】

3.2 案例演示

首先我们进入到 gdb / cgdb,然后它会等待我们输入指令

cgdb test 或者 cgdb test 

🍅l -- 行号显示

注:还可以查看指令文件,并且在输入指令之后,可以一直回车,就会显示该文件下的所有内容了

🍅 r -- 直接运行程序

🍅 增加/查看/删除断点

🍅 n/s -- 逐过程/逐语句

3.3 补充

watch(监视)

执行时监视一个表达式(如变量)的值,如果监视的表达式在程序运行期间的值发生变化,GDB 会暂停程序的执行,并且通知使用者

注:如果你有一些变量不应该修改,但是你怀疑它修改导致了问题,就可以 watch 它,如果发生了变化,就会通知你。

set var (确定问题原因)

更改一下标志位

条件断点

条件断点添加常见两种形式:1. 新增 2. 给已有断点追加

  • 新增:b 行号/文件名:行号/函数名 if i == 30 (条件)
  • 给已有断点追加:condition  2 i == 30, 其中 2 是已有断点编号,没有if

在此其他的指令我们就不过多讲解,大家可以看完文章后自行实践一下

4. 为什么要使用gdb / cgdb 来调试

1. 强大的调试功能

  • GDB 功能强大:GDB 允许开发者进行单步调试、设置断点、观察变量的值、检查内存状态等。这些功能帮助开发者深入了解程序的执行流程,并迅速定位错误。

2. 支持多种编程语言

  • 多语言支持:GDB 支持多种编程语言,包括 C、C++、Fortran、Go 等。这使得它成为跨语言开发的通用调试工具。

3. 适合命令行操作

  • 命令行界面:在 Linux 环境中,命令行操作是常见的工作方式。GDB 提供了一个强大的命令行界面,使得高级用户可以通过命令快速高效地调试程序。

4. 与其他工具的集成

  • 与其他开发工具集成:GDB 可以与许多其他开发工具和 IDE(集成开发环境)集成,例如 Eclipse、VSCode 等。这使得在开发过程中调试变得更加方便。

5. CGDB 提升用户体验

  • CGDB 的图形化界面:CGDB 提供了一个基于终端的用户界面,可以在终端中以图形化的方式查看代码和调试信息。这对于喜欢在终端中工作的开发者来说,提供了更好的可视化体验,尤其是在处理大型代码时。

6. 实时调试

  • 实时调试能力:GDB 支持对正在运行的程序进行调试,可以暂停程序的执行、检查状态并修改变量值,从而实时查看更改对程序行为的影响。

7. 追踪内存和资源问题

  • 内存调试:GDB 可以帮助开发者追踪内存泄漏和未定义行为,这对于 C 和 C++ 等语言尤为重要,因为这些语言对内存管理的要求较高。

8. 开源与社区支持

  • 开源和广泛社区支持:GDB 是开源的,拥有广泛的用户和开发者社区。用户可以获得丰富的文档、教程和支持,这对于解决问题和学习使用非常有帮助。


📖总结

本文主要讲了关于 gdb / cgdb 是什么、怎么用、以及为什么要去使用两者来调试,对于上面的一些基础指令,大家还是要多去运用熟悉。

💞 💞 💞【*★,°*:.☆( ̄▽ ̄)/$:*.°★* 】那么本篇到此就结束啦,如果我的这篇博客可以给你提供有益的参考和启示,可以三连支持一下 !!

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

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

相关文章

Kotlin:1.8.0 的新特性

一、概述 Kotlin 1.8.0版本英语官方文档 Kotlin 1.8.0 中文官方文档 The Kotlin 1.8.0 release is out and here are some of its biggest highlights: Kotlin 1.8.0发布了&#xff0c;下面是它的一些亮点: JVM 平台新增实验性函数&#xff1a;递归复制或删除目录内容改进了 …

SpringMVC——REST

路径请求方式请求行为 查询&#xff1a;GET 新增&#xff1a;POST 修改&#xff1a;PUT 删除&#xff1a;DELETE 有重复的东西怎么办

第L6周:机器学习|支持向量机(SVM):2. 支持向量机实战

本文为365天深度学习训练营 中的学习记录博客原作者&#xff1a;K同学啊 这里展示一下怎么调用scikit-learn库实现线性SVM&#xff0c;知道怎么调用扩展一下知识面就OK了。 1.scikit-learn库实现线性可分的SVM from sklearn import datasets from sklearn.model_selection im…

聊聊光刻工序常见术语(2)

上次&#xff0c;我们总结了光刻工序部分的术语&#xff0c;见文章&#xff1a; 《光刻工序常见术语中英文对照&#xff08;1&#xff09;》 这次&#xff0c;我们把剩下的又总结了一些&#xff0c;供大家参阅。 1&#xff0c;Developer Mist&#xff1a;显影液回溅产生的水…

计算机毕业设计 基于SpringBoot和Vue的课程教学平台的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

STM32(五)GPIO输入硬件电路及C语言知识复习

本小节主要是GPIO输入模式下的硬件电路和C语言知识的回顾 C语言中的数据&#xff1a;定义和引用 一、GPIO输入模式下的硬件和电路 1.按键介绍 可以用延时函数消除按键抖动 2.传感器模块介绍 &#xff08;1&#xff09;传感器元件的电阻会随模拟量的变化而变化&#xff0c;通…

【算法】链表:206.反转链表(easy)

系列专栏 《分治》 《模拟》 《Linux》 目录 1、题目链接 2、题目介绍 3、解法&#xff08;快慢指针&#xff09; 解题步骤&#xff1a; 关键点&#xff1a; 复杂度分析&#xff1a; 4、代码 1、题目链接 206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; …

通信工程学习:什么是SMTP简单邮件传输协议

SMTP&#xff1a;简单邮件传输协议 SMTP&#xff08;Simple Mail Transfer Protocol&#xff09;&#xff0c;即简单邮件传输协议&#xff0c;是用于电子邮件传输的标准协议。它定义了电子邮件在互联网上的传输方式&#xff0c;以及邮件服务器之间的通信方式。以下是对SMTP协议…

Stream流的初步认识,Stream流的思想和获取Stream流

一.Stream流的作用 package com.njau.my_stream;import java.util.ArrayList;/*** 目标&#xff1a;认识Stream流* 案例&#xff1a;将以“张”开头的人名筛选出来到一个新的集合中去&#xff0c;再将其中三个字的名字的筛选出来到新集合中去*/ public class StreamDemo1 {pub…

【算法竞赛】算法复杂度

计算的资源是有限的,竞赛题会限制代码所使用的计算资源。 计算资源有两种:计算时间和存储空间。与此对应的有时间复杂度和空间复杂度,时间复杂度衡量计算的次数,空间复杂度衡量需要的存储空间。 编程竞赛的题目在逻辑、数学、算法上有不同的难度:简单的题目,可以一眼看懂;复 …

1.8 物理层下的传输媒体

欢迎大家订阅【计算机网络】学习专栏&#xff0c;开启你的计算机网络学习之旅&#xff01; 文章目录 1 导引型传输媒体1.1 双绞线1.2 同轴电缆1.3 光缆 2 非导引型传输媒体2.1 无线电微波通信2.2 多径效应2.3 卫星通信2.4 无线局域网 在数据通信系统中&#xff0c;传输媒体是发…

排水系统C++

题目&#xff1a; 样例解释&#xff1a; 1 号结点是接收口&#xff0c;4,5 号结点没有排出管道&#xff0c;因此是最终排水口。 1 吨污水流入 1 号结点后&#xff0c;均等地流向 2,3,5 号结点&#xff0c;三个结点各流入 1/3 吨污水。 2 号结点流入的 1/3​ 吨污水将均等地流向…

【Nacos 架构 原理】服务发现模块之Nacos注册中心服务数据模型

文章目录 服务&#xff08;Service&#xff09;和服务实例&#xff08;Instance&#xff09;定义服务服务元数据定义实例实例元数据持久化属性 集群定义集群 生命周期服务的生命周期实例的生命周期集群的生命周期元数据的生命周期 服务&#xff08;Service&#xff09;和服务实…

vue3中el-input在form表单按下回车刷新页面

摘要&#xff1a; 在input框中点击回车之后不是调用我写的回车事件&#xff0c;而是刷新页面&#xff01; 如果表单中只有一个input 框则按下回车会直接关闭表单 所以导致刷新页面 再写一个input 表单 &#xff0c;并设置style“display:none” <ElInput style"display…

畅阅读小程序|畅阅读系统|基于java的畅阅读系统小程序设计与实现(源码+数据库+文档)

畅阅读系统小程序 目录 基于java的畅阅读系统小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师…

用C语言实现通讯录(顺序表实现)

SeqList.h 顺序表的头文件 #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <string.h> #include "Contact.h" typedef PerInfo SLDatatype;//PerInfo为结构体类型//动态顺序表 typedef struct SeqList {SLDatatype…

量产小妙招---向量间的Project和Product

1 背景 在日常工作中&#xff0c;不管是在感知或者规控&#xff0c;或者其它的模块中&#xff0c;经常需要处理两个向量之间的关系&#xff0c;这就引入了本篇博客和读者朋友们讨论的一个话题&#xff1a;Project和Product。 2 Project和Product 向量间的Project和Product在定义…

STM32单片机编程调试常见问题(二) Keil5软件调试中常见的配置问题

文章目录 一.概要二.‌Keil5‌调试时无法打断点并且部分代码语句执行被优化三.Keil5烧录STM32程序代码后无法自动复位四.Keil5调试时Watch界面中的变量不会实时更新五.Keil5编译后无法进行 go to跳转到变量或函数六.Keil5编辑时注释输入中文显示乱码问号七.Keil5退出调试时出现…

C. Bitwise Balancing

原题 C. Bitwise Balancing 解析 题意如图 我们要求 a , 其实 a 只要满足条件即可, 我们可以发现每一位都不会影响到其它位, 因此对每一位检查, 发现对b c a, d 有固定结果 b c a d 0 0 0 0 0 0 1 1 0 1 0 0 0 1 1 0 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1 0 bcd 无法为 011 和 1…

【Python】2. 变量和数据类型

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…