【Linux】调试器-gdb的使用说明(调试器的配置,指令说明,调试过程说明)

news2024/11/17 10:59:33

目录

 

00.背景

01.安装

02.生成调试信息

03.调试过程


 

00.背景

在软件开发中,通常会为程序构建两种不同的版本:Debug模式和Release模式。它们之间的区别主要在于优化级别、调试信息、错误检查等方面:

1.Debug 模式

  • 优化级别低:Debug 模式通常会关闭或者减少优化,这样可以使得生成的可执行文件更易于调试,因为优化通常会使得代码执行流程更难以跟踪。
  • 包含调试信息:在 Debug 模式下,编译器会保留更多的调试信息,例如变量名称、源代码行号等,这些信息有助于在调试过程中定位和解决问题。
  • 开启错误检查:Debug 模式通常会启用额外的错误检查和断言,这有助于在开发阶段及早发现程序中的错误。

2.Release 模式

  • 高度优化:Release 模式会应用更多的优化,以提高程序的运行性能和执行速度。这些优化可能包括代码内联、循环展开、函数内联等,使得程序更高效地运行
  • 剔除调试信息:为了减小可执行文件的大小,并提高程序运行效率,Release 模式通常会删除或者减少调试信息的存储,因此无法直接使用调试器进行源代码级别的调试。
  • 关闭错误检查:为了提高性能,Release 模式通常会关闭或者减少额外的错误检查和断言。

总结

Debug模式适用于开发阶段,面向开发者,可以方便开发者进行调试和定位问题;而Release模式则适用于发布阶段,面向用户,可以获得更高的性能和更小的可执行文件大小,但同时也失去了一些调试能力。因此,在进行软件开发时,通常会现在Debug模式喜爱进行开发和调试,然后切换到Release模式进行测试和发布。

下面讲到的gdb调试器就是在Debug模式下运行的。

01.安装

GDB程序是GNU项目的一部分,全称是GNU Debugger。它是一个用于调试C、C++等编程语言的程序的强大工具。我们需要安装GDB才能在系统上使用它。

1.包管理器

在Ubuntu上可以使用以下命令安装:

sudo apt-get install gdb

在CentOS上可以使用以下命令安装:

sudo yum install gdb

2.源代码编译

想安装最新版的GDB可以从GDB官网下载源代码编译安装
https://www.gnu.org/software/gdb/

02.生成调试信息

想要使用gdb对程序进行调试,首先要生成该程序对于的调试信息,gdb在加载程序时需要找到调试符号才能进行调试。通过以下命令生成调试信息:

gcc -g source.c -o a.out

这会编译‘source.c’并生成一个包含调试信息的可执行文件‘a.out’,使得可以在gdb中进行源代码级别的调试。

使用以下指令进入调试界面:

gdb a.out

043270cbca1e4776b47a18a00895c6bf.png

如果编译程序时没有使用选项“-g”,就不会生成调试信息,此时输入调试指令就会报错:

b3007542699144328b2405240a8dda0a.png

提示你gdb加载程序时没有找到调试符号

03.调试过程

具体调试时需要用到许多指令,这里列出来供大家参考:

  1. listl 行号:显示源代码,接着上次的位置往下列,每次列10行。
  2. listl 函数名:列出某个函数的源代码。
  3. runr:运行程序。
  4. nextn:单条执行。
  5. steps:进入函数调用。
  6. break(或 b)行号:在某一行设置断点。
  7. break 函数名:在某个函数开头设置断点。
  8. info breakpoints:查看断点信息。
  9. finish:执行到当前函数返回,然后挺下来等待命令。
  10. print(或 p):打印表达式的值,通过表达式可以修改变量的值或者调用函数。
  11. print(或 p) 变量:打印变量值。
  12. set var:修改变量的值。
  13. continue(或 c):从当前位置开始连续而非单步执行程序。
  14. delete breakpoints:删除所有断点。
  15. delete breakpoints n:删除序号为 n 的断点。
  16. disable breakpoints:禁用断点。
  17. enable breakpoints:启用断点。
  18. display 变量名:跟踪查看一个变量,每次停下来都显示它的值。
  19. undisplay:取消对先前设置的那些变量的跟踪。
  20. until X行号:跳至 X 行。
  21. breaktrace(或 bt):查看各级函数调用及参数。
  22. info(或 ilocals:查看当前栈帧局部变量的值。
  23. quit:退出 GDB。

显示源代码

输入“listl 行号”指令,终端会以“行号”居中的布局显示源代码

a83d9117f1504fe08b43343e944bde11.png

通常情况下我们习惯输入“l 0”或“l”来查看全部代码,但只会显示10行代码,这该如何呢?我们只需要继续按‘回车’键,直到显示出全部代码

be0acff4cce848109bd095a5aa242163.png

最后会提示总共有几行代码

断点

输入“runr”指令即可运行代码,当程序报错时我们可能需要打入断点来筛查错误代码处

此时可以使用“break(或 b)行号”指令,在某一行设置断点,并使用“info breakpoints(或b)”查看断点信息

3a2d87f2c7a7479987fc88835c8da15f.png

(注意:这里我们设置的断点行号和实际生成的断点行号不一致是因为,在打入断点时gdb会跳过头文件、符号{}、空格、函数名等)

gdb中,断点是有序号的,从1开始排序,当我们想删除断点时,就可以使用“delete breakpoints n”或“d n”指令,n就是断点的序号

我们输入“r”程序执行到断点处时可以使用“comtinue(或c)”命令让程序继续执行,如果后面还有断点,就会执行到下一个断点处,如果没有断点就会执行完整个程序。

61456c678add4eb69aec6dc393f91c6c.png

跟踪变量

在 gdb 中,可以使用“print(或 p)变量”查看变量的值,但是面对一个实时变化的变量时,每执行一步就要输入“p”指令查看一次,显然太麻烦,可以像vs编译器那样设置一个监视窗口实时查看变量值吗?

我们可以使用 display 命令(或者disp)来设置跟踪某个变量的值,并在每次程序执行时显示该变量的值。这样,在执行程序时,你可以同时查看变量的值,并继续执行程序。

和断点一样,也可以通过“info disp”指令来查看跟踪的变量,它们也都有从1开始的编号。

89614ed7beac408295fa4253a947413b.png

(注意:设置跟踪变量必须保证程序处于运行状态)

此时我们执行程序时就会同时显示变量

e96ad61a3cc04f35bb5e4a77c058b7f2.png

以上就是调试器gdb的基本使用说明~

 

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

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

相关文章

阿里云ECS服务器u1通用算力型CPU性能如何?

阿里云服务器u1是通用算力型云服务器,CPU采用2.5 GHz主频的Intel(R) Xeon(R) Platinum处理器,通用算力型u1云服务器不适用于游戏和高频交易等需要极致性能的应用场景及对业务性能一致性有强诉求的应用场景(比如业务HA场景主备机需要性能一致)&#xff0c…

Gremlin查询语言用法示例

Gremlin 的基本用法 Gremlin Query Language 的基本用法主要包括构建图遍历的查询语句,这些语句由一系列的步骤组成,用于从图形中检索数据和修改数据。以下是一些基本用法的示例和解释: 选择所有顶点: 使用g.V()可以选择图中的所…

包叔推荐12代i3-独显组装电脑主机配置清单

去年Intel第十代i5-依然是主流热选机型。 今年,随着i3-的价格优势越来越大,已经成功取代了i5-。 今天包叔推荐几套12代i3-独立显卡组装电脑主机配置。 列表:一组核心显示配置,其余三组均为独立显示配置。 适合主机预算在2000元至3…

Spring Cloud Gateway教程

1 微服务网关概述 Spring Cloud Gateway是在 Spring 生态系统之上构建的API网关服务,旨在为微服务架构应用提供一种简单有效的统一的API路由管理方式。 Spring Cloud Gateway主要功能: 反向代理认证鉴权流量控制熔断日志监控 2 Spring Cloud Gateway三…

搭建一个简单的网络结构(Pytorch实现二分类)

搭建一个简单的网络结构(Pytorch实现二分类) 搭建一个神经网络并进行训练的话,大致需要分为三步: 第一步是数据的处理,将数据整理成输入网络结构中合适的格式第二步是网络的搭建,包括每层网络的结构和前向…

Neo4j桌面版导入CVS文件

之后会出来一个提示框,而且会跳出相关文件夹: 然后我们将CSV文件放在此目录下: 我们的relation.csv是这样的 参见: NEO4J的基本使用以及桌面版NEO4J Desktop导入CSV文件_neo4j desktop使用-CSDN博客

数学建模体育建模和经济建模国防科大版

目录 6.体育中的数学建模 7.经济学问题中的数学建模 7.1.实物交换模型 7.2.边际效应 7.3.最佳消费选择模型 6.体育中的数学建模 体育科学的研究中,也有大量的数学建模问题,例如:棒球的最佳击球点问题、滑板滑雪赛道的设计、越野自行车比…

基于springboot+vue的旅游推荐系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

全网最强JavaWeb笔记 | 万字长文爆肝JavaWeb开发——Web开发介绍

万字长文爆肝黑马程序员2023最新版JavaWeb教程。这套教程打破常规,不再局限于过时的老套JavaWeb技术,而是与时俱进,运用的都是企业中流行的前沿技术。笔者认真跟着这个教程,再一次认真学习一遍JavaWeb教程,温故而知新&…

利用免费 GPU 部署体验大型语言模型推理框架 vLLM

vLLM简介 vLLM 是一个快速且易于使用的 LLM(大型语言模型)推理和服务库。 vLLM 之所以快速,是因为: 最先进的服务吞吐量 通过 PagedAttention 高效管理注意力键和值内存 连续批处理传入请求 使用 CUDA/HIP 图快速模型执行 量…

输入N个整数,输出这个整数两两组合且不重复的所有二元组,要求从小到大输出并且用括号的形式。

输入描述: 第一行输入一个整数N&#xff0c;N<30。 第二行输入N个整数。 输出描述: 按题意输出。 输入样例#: 3 1 2 3 输出样例#: (1,2) (1,3) (2,1) (2,3) (3,1) (3,2) #include <stdio.h>void quicksort(int s[],int min,int max); //快速排序int partitio…

那些王道书里的题目-----计算机网络篇

注&#xff1a;仅记录个人认为有启发的题目 p155 34.下列四个地址块中&#xff0c;与地址块 172.16.166.192/26 不重叠&#xff0c;且与172.16.166.192/26聚合后的地址块不会引入多余地址的是&#xff08;&#xff09; A.172.16.166.192/27 B.172.16.166.128/26 …

53 initrd/initramfs 相关

前言 呵呵 这里主要是 探究一下 根文件系统 相关的东西 以及 附加了一些 系统启动的相关信息 计算机启动 硬件重置寄存器 设置初始化数据 计算机访问 0xffff0, 执行 bios 的代码, bios 选择启动设备, 然后执行 启动设备 boolloader 的代码 bootloader 将 boot.img 加载…

玩具蛇(蓝桥杯)

文章目录 玩具蛇题目描述答案&#xff1a;552dfs 玩具蛇 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小蓝有一条玩具蛇&#xff0c;一共有 16 节&#xff0c;上面标着数字 1 至 16。每一节都是一个正方形的形…

GCC制作静态库详解

目录 前言 一.静态动态库区别 二.静态库制作 2.1 库文件命名 三.静态库文件制作 3.1 静态库制作 3.1.1 先获得.o文件 3.1.2 生成静态库文件 3.1.3 删除不必要文件 3.1.4 使用静态库 3.1.5 使用运行运行 前言 带大家快速入门&#xff0c;学会制作静态库。本文详细介绍在Linux系统…

“玩转文本魔法师:Python编程轻松变格式“

Hey小伙伴们&#xff0c;今天我们要一起打造一个文本转换器&#xff0c;就像神奇的魔法棒&#xff0c;能把普通的文字变成各种奇妙的格式&#xff01;想象一下&#xff0c;你的输入是&#xff1a;“Hello, World!”&#xff0c;输出可以是Markdown、HTML或者粗体、斜体的文字&a…

大语言模型(Large Language Model,LLM)简介

1. 什么是大语言模型 它是一种基于深度学习的人工智能模型&#xff0c;它从大量来自书籍、文章、网页和图像等来源的数据中学习&#xff0c;以发现语言模式和规则&#xff0c;如处理和生成自然语言文本。通常&#xff0c;大语言模型含数百亿&#xff08;或更多&#xff09;参数…

外包干了4年,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;19年通过校招进入杭州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

GJB5000软件配置管理计划模板

1 范围 1.1 标识 本条应描述本文档所适用的系统和软件的完整标识&#xff0c;适用时&#xff0c;包括其标识号、名称、缩略名、版本号和发布号。 1.2 系统概述 本条应概述本文档所适用的系统和软件的用途。它还应描述软件的一般特性&#xff1b;概述软件开发、运行和维护…

【 Mysql8.0 忘记登录密码 可以试试 】

** Mysql8.0 忘记登录密码 可以试试 ** 2024-3-21 段子手168 1、首先停止 mysql 服务 &#xff0c;WIN R 打开运行&#xff0c;输入 services.msc 回车打开服务&#xff0c;找到 mysql 服务&#xff0c;停止。 然后 WIN R 打开运行&#xff0c;输入 CMD 打开控制台终端输…