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

 

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

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

相关文章

使用uni-app框架进行移动端的适配(uniapp px转rpx)

1、打开uniapp 官网找到 插件市场介绍2、点击插件市场 px2rpx - DCloud 插件市场3、选择使用HBuilderX导入插件4、在HBuilder中点击右键选择开启px2rpx 5、开启成功后会有提示 6、根据设计搞的尺寸就行,我的是在这750*1620的,正常写px,保存…

[音视频学习笔记]六、自制音视频播放器Part1 -新版本ffmpeg,Qt +VS2022,都什么年代了还在写传统播放器?

前言 参考了雷神的自制播放器项目,100行代码实现最简单的基于FFMPEGSDL的视频播放器(SDL1.x) 不过老版本的代码参考意义不大了,我现在准备使用Qt VS2022 FFmpeg59重写这部分代码,具体的代码仓库如下: …

ubuntu20.04搭建nginx rtmp视频服务到指定位置解决权限不足

1.安装依赖 apt-get install build-essential libpcre3 libpcre3-dev libssl-dev2.建一个目录 mldir rtmp_nginx 3.源码下载 wget http://nginx.org/download/nginx-1.21.6.tar.gz wget https://github.com/arut/nginx-rtmp-module/archive/master.zip4.解压缩 tar -xf ng…

https 协议

什么是 Https 协议 HTTPS 也是⼀个应⽤层协议. 是在 HTTP 协议的基础上引⼊了⼀个加密层。HTTP 协议内容都是按照⽂本的⽅式明⽂传输的. 这就导致在传输过程中出现⼀些被篡改的情况。HTTPS 通过使用协议加密通信,可以保护数据在传输过程中的安全性,防止…

前端vue2如何处理Rss订阅、聚合,前端 vue2 如何处理xml 格式的数据

文章目录 前言解决 前言 最近看见csdn有Rss订阅这个功能&#xff0c;但发现这个接口响应的数据格式不是常用的Json格式而是xml&#xff0c;即下图的格式。 附响应的代码 <?xml version"1.0" encoding"utf-8" ?><rss version"2.0"&g…

微软开源Garnet高性能缓存服务安装

Garnet介绍 Garnet是一款微软研究院基于C#开发而开源的高性能缓存服务&#xff0c;支持Windows、Linux多平台部署&#xff0c;Garnet兼容Redis服务API&#xff0c;在性能和使用架构上较Redis有很大提升&#xff08;官方说法&#xff09;&#xff0c;并提供与Redis一样的命令操…

UE5的渲染-太难了

大家可以看到&#xff0c;这些都是UE的渲染&#xff0c;非常漂亮惊叹&#xff0c;渲染已经非常成熟&#xff0c;这些画面并不是离线渲染&#xff0c;而是实时渲染。早先年我们渲染CG动画都采用离线渲染&#xff0c;要用到庞大的渲染农场&#xff0c;每渲染一帧都可能需要半个小…

WebGIS航线编辑器(无人机航线规划)

无人机航点、航线规划&#xff0c;实现全自动航点飞行作业及飞行航拍。禁飞区、作业区功能保障飞行安全。 GIS引擎加载 const viewer new Cesium.Viewer("cesiumContainer", { imageryProvider: new Cesium.IonImageryProvider({ assetId: 3872 }), }); const im…

【Django实战一】创建新项目

一、新建Project django-admin startproject 项目名称二、创建应用 1、创建应用 python manage.py startapp 应用名称应用创建后&#xff0c;项目的根目录下会生成对应应用名称的文件夹 2、注册应用 新创建的应用需要在settings.py中的INSTALLED_APPS中注册该应用 INSTALL…

应急救援装备无人机是否必要?无人机在应急救援中的具体应用案例有哪些?

无人机&#xff08;Drone&#xff09;是一种能够飞行并自主控制或远程操控的无人驾驶飞行器。它们通常由航空器、控制系统、通讯链路和电源系统组成&#xff0c;并可以根据任务需求搭载不同类型的传感器、摄像头、货物投放装置等设备。 无人机的种类繁多&#xff0c;从大小、形…

基于python+vue的幼儿园管理系统flask-django-php-nodejs

随着信息时代的来临&#xff0c;过去的传统管理方式缺点逐渐暴露&#xff0c;对过去的传统管理方式的缺点进行分析&#xff0c;采取计算机方式构建幼儿园管理系统。本文通过课题背景、课题目的及意义相关技术&#xff0c;提出了一种活动信息、课程信息、菜谱信息、通知公告、家…

Docker专题-04 Nginx部署

Docker专题-04 Nginx部署 注&#xff1a; 本教程由羞涩梦整理同步发布&#xff0c;本人技术分享站点&#xff1a;blog.hukanfa.com 转发本文请备注原文链接&#xff0c;本文内容整理日期&#xff1a;2024-03-21 csdn 博客名称&#xff1a;五维空间-影子&#xff0c;欢迎关注…

本地化语音识别、视频翻译和配音工具:赋能音频和视频内容处理

随着人工智能技术的飞速发展&#xff0c;语音识别、视频翻译和配音等任务已经变得更加容易和高效。然而&#xff0c;许多现有的工具和服务仍然依赖于互联网连接&#xff0c;这可能会导致延迟、隐私问题和成本问题。为了克服这些限制&#xff0c;我们介绍了一种本地化、离线运行…

MATLAB环境下基于健康指标(Health indicator)的齿轮故障诊断

基于数据驱动的健康指标HI根据其构建策略的不同&#xff0c;常被分成两类&#xff0c;即&#xff1a;有量纲的物理指标和无量纲的虚拟指标。 有量纲的物理指标通常是由信号处理技术对收集到的时频域信号进行分析得到&#xff0c;常见的时域指标有均方根值、峰值指标、峰值因子…

docker swarm 集群创建

1&#xff0c;目的&#xff1a; 通过docker swarm 工具将一台或者多台安装了docker的服务器组成一个完整的集群&#xff0c;该集群中的node节点可以通过Leader节点管理。在使用docker stack部署时&#xff0c;可以将容器自动分发到合适的节点上。 2&#xff0c;服务器准备&am…

0基础学习VR全景平台篇第146篇:为什么需要3D元宇宙编辑器?

一.什么是3D元宇宙编辑器&#xff1f; 3D元宇宙编辑器是全新3DVR交互渲染创作工具&#xff0c;集3D建模、虚拟展厅、AI数字人等能力&#xff0c;渲染和虚拟现实技术于一身的生产力工具。 具有跨平台和随时随地编辑等特点&#xff0c;可广泛应用于展会、展厅、博物馆、可视化园…

flink join的分类

带窗口的join 下图是固定窗口,同样的还有滑动窗口和会话窗口join DataStream<Integer> orangeStream = ...; DataStream<Integer> greenStream = .

LeetCode每日一题——数组串联

数组串联OJ链接&#xff1a;1929. 数组串联 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 思路&#xff1a; 题目说 ans 由两个 nums 数组 串联 形成。那么我们就只需要历遍两次nums数组&#xff0c;将它放在我们的ans数组里。 注意&#xff1a; 题目函数对于我…

由浅到深认识Java语言(9):Eclipse IDE简介

该文章Github地址&#xff1a;https://github.com/AntonyCheng/java-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.c…

springboot网站开发如何配置log4j日志插件

springboot网站开发如何配置log4j日志插件&#xff01;为了便于服务器等环境下的错误情况的排查根源&#xff0c;还是很有必要使用日志插件的&#xff0c;它可以记录下我们提前埋下的锚点信息。 在遇到故障&#xff0c;查看这些锚点记录的日志信息&#xff0c;可以快速高效的解…