【Linux】调试工具GDB的使用及案例讲解

news2025/3/31 15:22:25

Linux系列


文章目录

  • Linux系列
  • 前言
  • 一、gdb的使用背景
  • 二、gdb的使用
  • 总结


本篇主要针对小白讲解,可以很多地方比较咯嗦

前言

GDB是Linux下一款强大的调试工具。GDB可以调试C、C++、Java等语言,对于在Linux下工作的程序员来说,GDB是必不可少的调试工具。

本篇我将以c程序,进行调试和讲解


一、gdb的使用背景

相较于Windows下的VS编译器中的点击调试,gdb调试器因不具备图形化界面,故而只能采用纯命令行的形式进行调试,这样也就意味着学习难度要高于VS.

在学习gdb的使用之前,我们首先要知道,只有【debug】环境下编译的可执行程序才可以被调试,而在Linux中gcc编译器默认编译环境为【release】,要编译生成【debug】版的可执行程序,我们可以使用gcc编译器配合‘-g’选项,生成【debug】文件。

二、gdb的使用

下面为test.c文件中的代码,我接下来使用它讲解,在有不同场景需求时,会进行更换,大家仔细看一下调用逻辑

1 #include<stdio.h>
  2 void func2()
  3 {
  4   printf("Hello Linux\n");
  5 }
  6 void func1()
  7 {
  8   int i,sum=0;
  9   for(i=0;i<10;i++)
 10   {
 11     sum+=i;
 12   }
 13   func2();
 14   printf("这是func1\n");
 15 }
 16 int func(int x)
 17 {
 18   func1();                                                                                                                        
 19   return x+100;
 20 }
 21 int main()
 22 {
 23   int a=0;
 24   printf("%d\n",a);
 25   int b =func(a);
 26   printf("%d\n",b);

下面为Makefile文件中的指令

  1 test:test.c
  2     gcc -o $@ $^ -g
  3 .PHONY:clear
  4 clear:
  5     rm -rf test   

生成【debug】文件开始调试。
进入调试阶段
语法:gdb 可执行程序

在这里插入图片描述
显示代码信息
语法l(list缩写) 行号/函数名-----每次显示十行

在这里插入图片描述
在这里插入图片描述
从上面两次执行结果可以看出,这个指令并不是从我们给的行号开始显示,而是在给的行号的上下一共显示十行。

在这里插入图片描述
指定函数显示。
若想从代码开始行显示,我们只需要‘l 0’即可:
在这里插入图片描述
我们可以看到当第一次执行,第二次再执行就可以不输入指令,直接回车即可,这是因为gdb自动记录最近一条指令.
启动程序
语法:r(run)

在这里插入图片描述
图中为程序执行结果,因为没有设置断点,所以程序执行到结束。
设置断点
语法:b(breakpoint) 行号/函数名----指定在某一行打断点

在这里插入图片描述
这里我在代码的23、25、26行设置了断点。
查看断点
语法:info b

在这里插入图片描述

上面为我们设置的断点信息。

删除指点断点
语法:d 要删除断点编号

在这里插入图片描述
删除全部断点
语法:d breakpoints

在这里插入图片描述
启用/禁用断点
语法:disable 编号-----禁用断点

在这里插入图片描述
这里可以看到,我重新设置的断点编号是从4开始,而不是从1,这是因为我们没有重新启动gdb,所以编号会从上次的编号继续向下。

在这里插入图片描述
对比指令执行前可以发现,【Enb】从y状态变为n状态。
这里依然可以配合breakpoints使用,大家可以自己尝试
语法:enable 编号----启用断点

在这里插入图片描述

调试
语法:n------逐过程调试(不会进入函数体内部)

为了更好的体现这个效果我,我将编号7的断点删除了
在这里插入图片描述
r执行到达第一个断点处。
在这里插入图片描述
此时可以看到程序执行到断点处,并没有进入func函数内部,而是直接向下执行。
语法:s----逐语句调试,会进入调用函数内部
在这里插入图片描述
当使用s执行调试时,程序会进入调用函数内部。
显示/追踪变量信息
语法:p 变量名-----将变量信息显示在显示器上

在这里插入图片描述
也可以配合取地址符,显示变量地址。
在这里插入图片描述
语法:display 变量名 ----追踪显示变量(执行任何一条指令后,都将指定的变量显示出来)

在这里插入图片描述
语法:undisplay 编号------取消常显示
在这里插入图片描述
刚刚取消了忘截图,又重新设置的,所以编号变为了2
此时再执行其他指令,i就不会常显示了。
查看函数调用
语法:bt----可以看到函数逐级调用的过程

在这里插入图片描述
将上图和我们调试的代码结合起来可以看出,bt命令显示出的编号,和我们代码逻辑中函数调用顺序是相反的,而这种情况就是一个压栈的过程。你可以自己尝试,整个函数调用链都是遵循这个逻辑的,所以我们就可以使用这个命令来查看栈帧的创建情况。
修改变量值
语法:set var 变量名=指定值

例如:当我们在一个循环中,想查看当i=1000时的情况,而让程序一点一点跑就太麻烦了,这是我们就可以使用这个命令,进行指定设置。

for(i=0;i<10;i++)
	{
	  sum+=i;
	}

在这里插入图片描述
可以看到我们通过指令,直接将i的值设置为了5.
指定行调转
语法:until 行号-----------这里的行号指的是,代码所处行

在这里插入图片描述
当前调试程序执行至第九行。

1	#include<stdio.h>
2	void func2()
3	{
4	  printf("Hello Linux\n");
5	}
6	void func1()
7	{
8	  int i,sum=0;
9	  for(i=0;i<10;i++)
10	  { 
11	    sum+=i;
12	  }
13	  func2();
14	  printf("这是func1\n");
15	}
16	int func(int x)
17	{
18	  func1();
19	  return x+100;
20	}
21	int main()
22	{
23	  int a=0;
24	  printf("%d\n",a);
25	  int b =func(a);
26	  printf("%d\n",b);
27	  return 0;
28	}


我们直接程序跳转的13行处,执行func2函数:
在这里插入图片描述
强制执行函数
语法:finish--------强制执行所处函数,并返回到调用该函数的位置

为了演示,我们重新开始调试。
在这里插入图片描述
此时函数执行至func1函数,我们使用命令将该函数强制执行完。
在这里插入图片描述
可以看到此时,程序将func1函数强制执行完毕,并返回至调用处等待指令。
跳过结点
语法:c--------当我们在调试时,想要从一个断点直接跳转到下一个断点想对断,可以使用这个命令

在这里插入图片描述大家结合上面代码的调用逻辑分析

这是当前所设置的断点,我期望从23行代码,直接运行至8行,中间的程序不让他显示的执行。(这是使用n或s命令无法办到的)
在这里插入图片描述

总结

当大家对指令比较熟悉时,gdb的使用还是比较简单的,以上是我个人,经常使用的命令,是对标VS下编译的调试功能来介绍的,如果这不能满足你的要求,可以搜一些更高级的用法。

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

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

相关文章

DeepSeek回答:AI时代Go语言学习路线

最近有小伙伴经常会问&#xff1a;**该如何学习入门Go语言&#xff1f;怎样提升Go语言Coding水平&#xff1f;**这篇文章我们就使用DeepSeek来梳理下Go语言在AI时代的学习路线。 向DeepSeek提问的问题原文&#xff1a; 你现在是一名资深的Go语言工程师&#xff0c;精通Go语言并…

1分钟用DeepSeek编写一个PDF转Word软件

一、引言 如今&#xff0c;在线工具的普及让PDF转Word成为了一个常见需求&#xff0c;常见的pdf转word工具有收费的wps&#xff0c;免费的有pdfgear&#xff0c;见下文&#xff1a; PDFgear:一款免费的PDF编辑、格式转化软件-CSDN博客 还有网上在线的免费pdf转word工具smallp…

【Linux】初探信号的奥秘

目录 一、引入信号&#xff1a; 1、什么是信号&#xff1a; 二、前后台进程&#xff1a; 三、信号的处理方式&#xff1a; 四、键盘数据与信号&#xff1a; 前言&#xff1a; 在Linux系统编程中&#xff0c;信号&#xff08;Signal&#xff09;是一种至关重要的进程间通信…

Ubuntu搭建esp32环境 配置打开AT指令集 websocket功能

1&#xff0c;搭建前提 环境搭建参考乐鑫官网给的本地编译 ESP-AT 工程方法 因为公司电脑和网络的特殊性&#xff0c;不能正确解析域名&#xff08;仅在浏览器上可以访问&#xff09; &#xff0c;所以这边访问的时候改成了ssh 未了避免使用外网困难的问题&#xff0c;这里用…

express(node ORM) 使用 Winston 记录日志 及数据库保存日志

一、安装 npm i winston npm i winston-mysql二、 配置 winston 2.1、封装 const config require(__dirname ‘/…/config/config.json’)[env]; 先判断当前是什么环境&#xff0c;如果.env中没有配置&#xff0c;就是开发环境。接着去config/config.json中读取对应的配置。…

是德科技keysight N5173B信号发生器,是一款经济高效的仪器

是德科技keysight N5173B信号发生器安捷伦N5173B信号源 是德N5173B微波模拟信号发生器&#xff0c;拥有 9 kHz 至 40 GHz 的频率覆盖范围&#xff0c;N5173B为宽带滤波器、放大器、接收机等器件的参数测试提供了必要的信号&#xff0c;是一款经济高效的仪器。 N5173B特点&…

从零到一:如何用阿里云百炼和火山引擎搭建专属 AI 助手(DeepSeek)?

本文首发&#xff1a;从零到一&#xff1a;如何用阿里云百炼和火山引擎搭建专属 AI 助手&#xff08;DeepSeek&#xff09;&#xff1f; 阿里云百炼和火山引擎都推出了免费的 DeepSeek 模型体验额度&#xff0c;今天我和大家一起搭建一个本地的专属 AI 助手。  阿里云百炼为 …

FFmpeg视频处理入门级教程

一、FFmpeg常规处理流程 #mermaid-svg-W8X1llNEyuYptV3I {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-W8X1llNEyuYptV3I .error-icon{fill:#552222;}#mermaid-svg-W8X1llNEyuYptV3I .error-text{fill:#552222;str…

C/C++ | 每日一练 (4)

&#x1f4a2;欢迎来到张胤尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 C/C | 每日一练 (4)题目参考答案基础容器序列容器std:…

蓝桥杯备考:贪心算法之矩阵消除游戏

这道题是牛客上的一道题&#xff0c;它呢和我们之前的排座位游戏非常之相似&#xff0c;但是&#xff0c;排座位问题选择行和列是不会改变元素的值的&#xff0c;这道题呢每每选一行都会把这行或者这列清零&#xff0c;所以我们的策略就是先用二进制把选择所有行的情况全部枚举…

基于 CFD 预测的机器学习第 2 部分:在 Benchmark 应用程序上使用 Stochos 预测流场

了解机器学习和 Stochos 如何彻底改变制造业的 CFD 预测。 挑战 预测复杂流体动力学场景中的流场一直是工程师和科学家面临的重大挑战。传统的计算流体动力学 &#xff08;CFD&#xff09; 方法需要大量的计算资源和时间&#xff0c;因此难以处理实时预测和大规模模拟。 此外…

批量导出数据库表到Excel

这篇文章将介绍如何批量的将多个甚至成千上万的数据库表导出为Excel文件。 准备数据 如下图是数据库里的表&#xff0c;我们需要将它们全部导出为excel文件&#xff0c;这里以SQL Server数据库为例 新增导出 打开的卢导表工具&#xff0c;新建数据库连接&#xff0c;这里以S…

力扣提升第一天

力扣提升第一天 题目链接&#xff1a;https://leetcode.cn/problems/design-memory-allocator/?envTypedaily-question&envId2025-02-25 一开始解题思路 暴力解决法 我奔着先从简单的写法做起&#xff0c;之后再想办法进行改进&#xff0c;心里已经预料到会出现超出时间…

uni-app 开发 App 、 H5 横屏签名(基于lime-signature)

所用插件&#xff1a;lime-signature 使用到 CSS 特性 绝对定位transform 旋转transform-origin transform 原点 复习一下定位元素&#xff08;相对定位、绝对定位、粘性定位&#xff09; 代码# <template><view class"signature-page"><view clas…

【Python】Python顺序语句经典题(四)

Python顺序语句经典练习题例题&#xff08;四&#xff09;。题目来源&#xff1a;Acwing 前三期合集&#xff1a;【Python】Python顺序语句经典题合集-CSDN博客 目录 1.最大值 题目描述 解题思路 AC代码 2.距离 题目描述 AC代码 3.燃料消耗 题目描述 AC代码 4.钞票…

03_pyqt5 + vlc 实现视频播放器

1.功能需求如图 按钮: 播放/暂停, 前进/后退, 视频上一个/下一个, 打开视频进度条: 视频进度条显示, 进度条拖拽, 音量控制按键控制: 1,2,3,4缩放画面大小, 2.方案选择 开发语言: python UI界面: pyqt5 qt_designed 设计ui布局 视频编码: python-vlc 方案说明: 视频解码可…

prometheus+node_exporter+grafana监控K8S信息

prometheusnode_exportergrafana监控K8S 1.prometheus部署2.node_exporter部署3.修改prometheus配置文件4.grafana部署 1.prometheus部署 包下载地址&#xff1a;https://prometheus.io/download/ 将包传至/opt 解压 tar xf prometheus-2.53.3.linux-amd64.tar.gz 移动到…

IDEA关闭SpringBoot程序后仍然占用端口的排查与解决

IDEA关闭SpringBoot程序后仍然占用端口的排查与解决 问题描述 在使用 IntelliJ IDEA 开发 Spring Boot 应用时&#xff0c;有时即使关闭了应用&#xff0c;程序仍然占用端口&#xff08;例如&#xff1a;4001 端口&#xff09;。这会导致重新启动应用时出现端口被占用的错误&a…

山东大学软件学院nosql实验三

实验题目&#xff1a; 用Java做简单查询(2学时) 实验内容 用API方式&#xff0c;做简单查询。 实验要求 在以下要求中选择至少2个&#xff0c;使用Java语言实现数据查询&#xff0c;最终把数据输出到前端界面。 &#xff08;1&#xff09;找出年龄小于20岁的所有学生 &…

零样本学习 zero-shot

1 是什么 2 如何利用零样本学习进行跨模态迁移&#xff1f; demo代码 安装clip pip install ftfy regex tqdm pip install githttps://github.com/openai/CLIP.git import torch import clip from PIL import Image# 加载 CLIP 模型 device "cuda" if torch.cuda.i…