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

目录

 

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的基本使用说明~

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

灵境矩阵平台x百度---智能体(一)

什么是数据插件 大模型插件:大语言模型插件是随着大语言模型发展而诞生的全新插件。大语言模型插件的核心是Web API独立于大语言模型,插件开发过程不受大语言模型的约束,同时没有开发语言的限制,更加通用,只要WebAPI遵循RESTfuI相…

如何在 Odoo 17 的 齿轮菜单⚙️ 中添加新菜单

在 Odoo 中,齿轮菜单是一个重要组件,允许用户访问与系统内不同模型和功能相关的各种配置选项和设置。它通常由位于用户界面左上角的齿轮或齿轮图标表示。下图显示了 "sale.order "模型的齿轮菜单。 默认情况下,我们在 CogMenu 中提…

js 实现动画的两种方案对比:setTimeout vs RAF (requestAnimationFrame)

setTimeout 需手动控制频率,页面隐藏后仍会执行动画,更加耗费性能。 requestAnimationFrame 简称 RAF , 会在浏览器中每次刷新屏幕时调用一个函数,用于创建平滑的动画,因为它会自动适应屏幕的刷新率,无需手动控制频率。…

实战whisper语音识别第一天,部署服务器,可远程访问,实时语音转文字(全部代码和详细部署步骤)

Whisper是OpenAI于2022年发布的一个开源深度学习模型,专门用于语音识别任务。它能够将音频转换成文字,支持多种语言的识别,包括但不限于英语、中文、西班牙语等。Whisper模型的特点是它在多种不同的音频条件下(如不同的背景噪声水…

今天聊聊新零售

一、什么是新零售? 2016年,在杭州举行的“云栖大会”上,马云发表了讲话,首次提出了“新零售”这一概念。 1.1 新零售概念 新零售,英文是New Retailing,新零售是对人货场的重构。人是消费者、销售人员、…

C++的vector类(一):vector类的常见操作

目录 前言 Vector类 遍历与初始化vector ​vector的扩容机制 vector的对象操作 find与insert 对象数组 前言 string类中还有一些内容需要注意: STL 的string类怎么啦? C面试中string类的一种正确写法 C STL string的Copy-On-Write技术 C的st…

网络编程 - 套接字

1、预备知识 1.1、理解源IP地址和目的IP地址 在IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址; 思考: 我们光有IP地址就可以完成通信了嘛? 想象一下发qq消息的例子, 有了IP地址能够把消息发送到对方的机器上, 但是还需要有一个其他的标识来区分…

kafka面试篇

消息队列的作用:异步、削峰填谷、解耦 高可用,几乎所有相关的开源软件都支持,满足大多数的应用场景,尤其是大数据和流计算领域, kafka高效,可伸缩,消息持久化。支持分区、副本和容错。 对批处理…

使用ansible剧本进行lvm分盘

使用 Ansible 剧本(Playbook)进行 LVM 分区管理是一种自动化的方式,可以帮助管理员在多台主机上批量管理逻辑卷。 部署环境 3台主机,添加硬盘 ansible-galaxy collection install community.general 联网执行,下…

蓝桥杯算法心得——游戏(优先队列)

大家好,我是晴天学长,优先队列的题,式子化简非常重要,需要的小伙伴可以关注支持一下哦!后续会继续更新的。💪💪💪 1) .游戏 2) .算法思路 附近最小 1.接收数据 2.找出最小的&#…

docker 配置国内阿里镜像源

在/etc/docker/目录下新建daemon.json文件 在文件中写入 {"registry-mirrors": ["https://jmphwhtw.mirror.aliyuncs.com"] } 以管理员身份运行命令 systemctl daemon-reload systemctl restart docker

羊大师羊奶靠谱么?消费口碑深度讲解

羊大师羊奶靠谱么?消费口碑深度讲解 羊大师羊奶,作为羊奶市场的一颗璀璨明星,其靠谱性一直备受广大消费者的关注。那么,羊大师羊奶究竟靠不靠谱呢?这需要我们从品牌实力与消费口碑两个方面进行深度解析。 从品牌实力来…

小米相册提取表格选项消失解决方法

小米相册这次的提取表格选项消失 故障原因: 因为部分用户将小爱视觉(原名扫一扫)这个应用给卸载了导致 解决方法 应用商店下载 小爱视觉 安装后授权即可使用 注意:系统最好为最新的 Xiaomi HyperOS系统

PFXA401SF Millmate控制器400设计用于提供大量功能 Brown Boveri BBC

PFXA401 Millmate控制器400设计用于提供大量功能,同时具有高度的用户友好性。 控制单元涵盖了所有边缘传感器的安装可能性。这意味着用户只需按照逐步说明设置控制单元,并计算正确的料带边缘和中心位置及宽度。 计算相对于轧机的真实带材位置和宽度 过滤…

RabbitMQ在Java中使用 SpringBoot 从基础到高级

充分利用每一个监听者 需要充分利用每一个消费者,需要在配置文件中加上prefetch配置并设置为1 rabbitmq:listener:simple:prefetch: 1 # 每次只能获取一条消息,处理完成才能获取下一个消息创建交换机和队列 创建队列 "fanout.queue1"&…

云农场种植、领养、收获,认养模式新浪潮

​ 小编介绍:10年专注商业模式设计及软件开发,擅长企业生态商业模式,商业零售会员增长裂变模式策划、商业闭环模式设计及方案落地;扶持10余个电商平台做到营收过千万,数百个平台达到百万会员,欢迎咨询。 在…

服务器中了mallox勒索病毒还能恢复数据吗?

什么是mallox勒索病毒? mallox是一种最近多发的勒索病毒类型,它主要针对企业的Web应用和数据库服务器进行攻击。mallox后缀的勒索病毒会加密用户的重要文件数据并以此为要挟索要赎金。该类病毒会绕过企业的防火墙和各种防护软件,对目标设备进…

Python 将HTML转为PDF、图片、XML、XPS格式

网页内容是信息传播的主要形式之一。在Web开发中,有时候我们需要将HTML文件以不同的格式保存或分享,比如PDF、图片(如PNG或JPEG)、XML或XPS等。这些格式各有优势,适合不同的用途。在这篇文章中,我们将介绍如…

GPU 使用率监测及可视化

1. 使用 nvidia-smi可视化 直接在终端输入nvidia-smi动态查看GPU的使用情况watch -n 0.5 nvidia-smi其中0.5表示每隔0.5秒更新一次,时间可以调整 2. 使用nvitop可视化 2.1 nvitop的使用 (1) 安装 pip install nvitop(2) 查看GPU使用率 nvitop

【LAMMPS学习】三、构建LAMMPS(11)开发构建选项

3. 构建 LAMMPS 3.11.开发构建选项 LAMMPS 中的构建过程提供了一些在开发、测试或调试期间有用的额外选项。 3.11.1.监视编译标志(仅限 CMake) 有时需要验证 CMake 构建生成的编译标志的完整序列。要在编译期间启用更详细的输出,可以使用…