Linux--gdb(调试工具)

news2025/6/17 13:55:45

1. 背景

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


 2. 命令

gdb binFile 退出: ctrl + d 或 quit 调试命令:
list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
list/l 函数名:列出某个函数的源代码。
r或run:运行程序。
n 或 next:单条执行。
s或step:进入函数调用
break(b) 行号:在某一行设置断点
break 函数名:在某个函数开头设置断点
info break :查看断点信息。
finish:执行到当前函数返回,然后挺下来等待命令
print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数
p 变量:打印变量值。
set var:修改变量的值
continue(或c):从当前位置开始连续而非单步执行程序
run(或r):从开始连续而非单步执行程序
delete breakpoints:删除所有断点
delete breakpoints n:删除序号为n的断点
disable breakpoints:禁用断点
enable breakpoints:启用断点
info(或i) breakpoints:参看当前设置了哪些断点
display 变量名:跟踪查看一个变量,每次停下来都显示它的值
undisplay:取消对先前设置的那些变量的跟踪
until X行号:跳至X行
breaktrace(或bt):查看各级函数调用及参数
info(i) locals:查看当前栈帧局部变量的值
quit:退出gdb
 


3.一个例子 

这里有一个C语言的代码:

我们在makefile中构建自动化:

运行测试:

运行成功

尝试调试:

报错了,这是因为Linux gcc/g++出来的二进制程序,默认是release模式,我们要在编译时加上-g指定为debug模式

Debug版本和Release版本是软件开发中常见的两种构建版本,它们之间有一些重要的区别:

1. **Debug版本**
- **编译优化低**:Debug版本通常不进行优化,以便开发人员能够更容易地调试代码。
- **包含调试信息**:Debug版本包含了大量的调试信息,如符号表、源代码行号等,以便开发人员在调试时能够准确定位问题。
- **运行速度较慢**:由于没有进行优化,Debug版本的运行速度通常比Release版本慢。
- **体积较大**:由于包含了大量调试信息,Debug版本的体积通常比Release版本大。

2. **Release版本**
- **编译优化高**:Release版本通常进行了各种优化,如代码优化、去除无用代码等,以提高程序的运行效率。
- **不包含调试信息**:Release版本通常不包含调试信息,以减小程序体积和提高运行效率。
- **运行速度较快**:由于进行了优化,Release版本的运行速度通常比Debug版本快。
- **体积较小**:由于不包含调试信息,Release版本的体积通常比Debug版本小。

总的来说,Debug版本适合开发和调试阶段,能够提供更多的调试信息和便于定位问题;而Release版本适合发布和生产环境,能够提供更高的运行效率和更小的体积。

我们可以看到,在debug版本下,同一个程序的体积要大一些。

接下来我们就开始调试:

我们要与windows中的基本调试功能做个平替:

Linux中也要提供这些功能

1.  在Linux中运行起来才能调试

2.  我们也要看到代码

3.  打断点

4.  局部调试

5.  看到局部变量的内容和地址

6.  看到调用栈

7.  单步

8.  进入函数


1.gdb mytest-d 进入调试


2.“l 1"(l+行号,显示指定行之后的代码) 从头开始罗列代码,想要看更多的代码,直接按回车


3.运行调试”r“,输入r后程序直接走完了,但我们不想让他直接走完,这时我们就要进行设置断点。


4.设置断点 ”b+行号/函数名/file:行号“

对函数设置断点的时候,是在函数体内的第一行代码开始

查看断点:“info+b”

删除断点:删除断点是根据info中断点的编号来进行删除的,“d+编号”

在info中 Enb表示的是:这个断点是否开启,y表示开启了。r开始运行,此时程序就在第一个断点处停下来了

当我们再用info查看的时候,发现第一个断点已经提示被命中一次了

我们尝试将1号断点关闭:“disable+编号“关闭此段点,info查看,Enb显示为n,表示此断点被关闭了。

我们再次运行一下,这时编译器会提示你正常调试是否要重新开始,输入y重新开始调试。我们发现编译器跳过了1号断点,在2号断点处停下来了。

重新启用断点:”enable+编号“


5.逐语句和逐过程的进行调试

逐过程:不区分语句还是函数,遇到函数不进入函数:”n“回车就好了

逐语句:遇到函数进入函数,函数也是一条一条语句构成的:"s"回车就好了

此时就进入函数了。


6.显示变量的内容和地址

”p”:查看指向neir

display:指定局部变量内容(地址),让其常显示且自动更新

取消常显示:undisplay+编号:取消指定常显示的内容(编号就是变量前面的数字)

这样就取消变量的常显示了


7.单步操作

在调试中单步操作是非常重要的,如果代码量庞大,单步操作可以初步的确定错误的范围,然后在这个范围里进行逐过程或者逐语句的进行调试。

单步:从一个断点处跳到下一个断点处,如果没有报错,那么两个断点间不存在错误。

“c”然后回车


8.调用堆栈

调试中调用堆栈是一个非常有用的工具,它记录了程序在执行过程中函数调用的顺序和位置。调用堆栈的作用包括:

1. **跟踪函数调用关系**:调用堆栈可以显示程序执行过程中每个函数的调用顺序,帮助开发人员理解函数之间的调用关系。

2. **定位问题来源**:当程序发生错误或异常时,调用堆栈可以指示错误发生的位置,帮助开发人员快速定位问题的根源。

3. **调试过程中的上下文**:调用堆栈提供了函数调用的上下文信息,包括每个函数的参数、局部变量和返回地址,有助于开发人员在调试过程中了解每个函数的执行情况。

4. **追踪递归调用**:对于递归函数或多层嵌套调用的情况,调用堆栈可以清晰地显示每一层函数调用的情况,帮助开发人员追踪递归调用的执行过程。

5. **优化程序性能**:通过分析调用堆栈,开发人员可以了解程序中哪些函数被频繁调用,从而帮助他们进行性能优化,减少不必要的函数调用或优化关键函数的执行效率。

一句话:函数级别的范围查找(如果报错,则证明函数出错)

bt:调用堆栈

finish:将一个函数运行结束,就停下来

until:在一个范围内,直接运行到指定行

在这里我们直接跳过了一个循环


9.其它调试指令

set var name = value :修改一个变量的内容(不用改代码,进行多分支的测试)
 

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

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

相关文章

欧科云链:角力Web3.0,香港如何为合规设线?

在香港拥抱Web3.0的过程中,以欧科云链为代表的合规科技企业将凸显更大重要性。 ——据香港商报网报道 据香港明报、商报等媒体报道,港区全国政协兼香港选委界立法会议员吴杰庄在日前召开的全国两会上提出在大湾区建设国际中小企业创新Web3融资平台等提案&#xff0…

《Python源码剖析》之字符串拼接的一个效率问题

前言 我们常用的字符串拼接方法有两个,一个是通过“”号实现字符串的拼接,还一个就是通过join方法来实现拼接,前者在写法上更加便利,和数字之间的加法运算一样,通常只有两个运算对象,只不过他们的运算规则…

300分钟吃透分布式缓存-26讲:如何大幅成倍提升Redis处理性能?

主线程 Redis 自问世以来,广受好评,应用广泛。但相比, Memcached 单实例压测 TPS 可以高达百万,线上可以稳定跑 20~40 万而言,Redis 的单实例压测 TPS 不过 10~12 万,线上一般最高也就 2~4 万,…

7. 交叉开发环境设置

嵌入式交叉编译工具 ​ 交叉编译工具是为了使在上位机中编译的文件能够在不同平台的目标机中执行,搭建交叉编译环境是嵌入式开发的第一步,也是关键的一步。不同的体系结构、不同的操作系统,甚至是不同版本的内核,都会用到不同的交…

差距拉开了!量化大厂最新业绩排行曝光!

经历了一月份的失落和二月份绝地反攻,量化大厂们的整体业绩备受关注。 而今年2月份的量化战绩,甚为关键! 毕竟市场指数“前低后高”,基金经理与投资人开年以来,共同经历了“惊心动魄”的考验。 量化大厂&#xff0c…

帮管客CRM jiliyu接口存在SQL漏洞 附POC软件

免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 1. 帮管客CRM简介 微信公众号搜索:南风漏洞复现文库…

分类算法入门:以鸢尾花数据集为例

近两年人工智能技术蓬勃发展,OpenAI连续放出ChatGPT、Sora等“王炸”产品,大模型、AIGC等技术带来了革命性的提升,很多人认为人工智能将引领第四次工业革命。国内各大互联网公司也是重点投资布局,从个人角度来说要尽快跟上时代的潮…

12. 建立用户表并使用雪花算法生成用户ID

文章目录 一、建立用户表二、雪花算法生成唯一ID三、将雪花算法整合到我们的项目中 一、建立用户表 上一节我们搭建完了脚手架,从这一节开始,就正式进入到业务逻辑的开发了。首先要开发的就是博客系统的用户注册与登录功能。 既然涉及到用户&#xff0…

深入浅出计算机网络 day.1 概论④ 计算机网络的定义和分类

不要退却,要绽放魅力 我的心会共鸣 和你 —— 24.3.9 一、计算机网络的定义 计算机网络早期的一个最简单定义 现阶段计算机网络的一个较好的定义 二、计算机网络的分类 按交换方式分类 按使用者分类 按传输介质分类 按覆盖范围分类 按拓扑结构分类,可…

数据结构之deque双端队列

一、概念: 众所周知,数据结构是用来存储数据,deque也不例外,他是集结了队列和栈的性质而成的结构,他几乎拥有所有数据结构能有的操作,看似已经大杀四方,可实际情况如何呢,那就带者这…

markdown页面宽度放宽

变成以上样式 ------------------------------------------------ 然后最后一行加上 #write{ max-width: 90%; } /* 调整源码正文宽度 */ #typora-source .CodeMirror-lines { max-width: 90%; } /* 调整输出 PDF 文件宽度 */ media print { #write{ max-w…

C++字符串操作【超详细】

零.前言 本文将重点围绕C的字符串来展开描述。 其中,对于C/C中字符串的一些区别也做出了回答,并对于C的(string库)进行了讲解,最后我们给出字符串的不同表达形式。 开发环境: VS2022 一.字符串常量跟字…

UE4.27_ParticleSystem(没写完的材料)

UE4.27_ParticleSystem(没写完的材料) 参考实例: UE4[蓝图]下雪效果及雪的材质的实现

docker学习入门

1、docker简介 docker官网: www.docker.com dockerhub官网: hub.docker.com docker文档官网:docs.docker.com Docker是基于Go语言实现的云开源项目。 Docker的主要目标是:Build, Ship and Run Any App, Anywhere(构建&…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Image)

Image为图片组件,常用于在应用中显示图片。Image支持加载PixelMap、ResourceStr和DrawableDescriptor类型的数据源,支持png、jpg、jpeg、bmp、svg、webp和gif类型的图片格式。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容&am…

数据库系统概论(超详解!!!) 第三节 关系数据库

1.基本概念 1. 域(Domain) 域是一组具有相同数据类型的值的集合。 2. 笛卡尔积(Cartesian Product) 给定一组域D1,D2,…,Dn,允许其中某些域是相同的。 D1,D2…

phpStudy,自定义php版本

新版phpStudy,支持自定义php版本,只支持php5.3.0以后的任意版本。 一定要下载win版php,不是下载源码,win版php下载地址:http://windows.php.net/ 也就是地址: https://windows.php.net/downloads/releases…

使用Julia语言和R语言实现K-均值

K-均值算法基础 K-均值聚类算法属于一种无监督学习的方法,通过迭代的方式将数据划分为K个不重叠的子集(簇),每个子集由其内部数据点的平均值来表示。计算方法大体如下: 1.初始化簇中心 选择K个数据点作为初始的簇中心…

A5自媒体wordpress主题模板

一个简洁的wordpress个人博客主题,适合做个人博客,SEO优化效果挺不错的。 https://www.wpniu.com/themes/204.html

数据分析-Pandas最简单的方法画矩阵散点图

数据分析-Pandas直接画矩阵散点图 数据分析和处理中,难免会遇到各种数据,那么数据呈现怎样的规律呢?不管金融数据,风控数据,营销数据等等,莫不如此。如何通过图示展示数据的规律? 数据表&…