Linux——gdb调试器

目录

   前言:

二.gdb定义及指令:

如何查看该exe文件是否为Debug版本?两种方法:

三.gdb调试:

        调试指令1:l指令(小写L)

run指令:运行程序,相当于VS中的直接运行不调试——可简化输入r

 break指令:设置断点——指令可简化输入为b ​编辑 

info b指令:查看整个代码所有的断点信息

next指令:单条执行,相当于VS调试工具中的逐过程功能——可简化输入n

step指令:进入函数内部,相当于VS调试工具的逐语句功能——可简化输入s

continue指令:从当前位置的断点处跳到下一个断点处

 finish指令:gdb调试器自动停止调试,并且输出最终的代码执行结果。 

p+变量指令:可以查看当前变量的数值

display +变量指令:可以一直查看该变量的数值

 bt指令:查看当前所处函数栈帧的数据

delete breakpoints: 删除所有断点

delete breakpoints n: 删除序号为n的断点

disable breakpoints: 禁用断点

enable breakpoints: 启用断点


   前言:

         之前我介绍了Linux的编辑器vim,是专门用来编辑各种类型的语言代码。它主要使用的有3种模式,这三种模式涉及到的快捷键,设计方法极大的方便了我们编写代码,但是也只限于编写代码数据。

        然后又介绍了gcc/g++编译器,物如其名,它就是用来编译链接源文件进而生成可执行文件的。

        在Windows操作系统下,我们常用的编辑代码的软件有VS(Visual Studio)编译器,VS是一个基本完整的开发工具集,Visual Studio 旨在成为用于构建应用程序的功能丰富、强大且全面的解决方案,例如在该编译器下有着智能自动完成功能,可以帮助编程人员更快地输入代码;也有内置调试器,里面逐语句逐过程,断电功能帮助开发人员快速调试代码......。也就是说VS是编辑、编译、调试一体化的软件工具。

     

二.gdb定义及指令:

       在Linux操作系统中,调试代码又是一个单独的软件,叫gdb调试器。gdb调试器仍是Linux中没有的,需要使用yum指令去下载该软件:

sudo yum install -y gdb

子用户可以使用该指令,若子用户没有sudo权限,只能以root身份去下载

一般来说,GDB主要帮助你完成下面四个方面的功能:

1、按照自定义的方式启动运行需要调试的程序

2、可以使用指定位置和条件表达式的方式来设置断点
3、程序暂停时的值的监视
4、动态改变程序的执行环境 

 下载好后,我们需要回顾一下之前使用gcc/g++编译器,生成的可执行文件指令为:

gcc filename.c -o filename.exe

g++ filename.cpp -o filename.exe 

这两种指令默认的链接方式都是关联动态库,若要使用静态库链接,则需要如下:

gcc filename.c -o filename.exe -static

g++ filename.cpp -o filename.exe -static

 

 此外,gcc/g++默认生成的可执行文件类型是:release类型。

什么是release?

        Release 是“发行”的意思,Release 版本就是最终交给用户的程序,编译器会使尽浑身解数对它进行优化,以提高执行效率。Release版本的可执行文件体积会更小一些。

此外,除了Release版本,还有一种Debug版本。

        Debug 是“调试的意思”,Debug版本是程序开发人员用来测试代码的,编译器在生成 Debug 版本的程序时会加入调试辅助信息,并且很少会进行优化。

        根据上面了解的信息,我们若想使用gdb调试器对Debug类型的可执行文件进行调试就需要使用该指令:

gcc -g filename.c -o filename.exe 

                                -g选项是生成可执行文件是否为Debug的关键!

如何查看该exe文件是否为Debug版本?两种方法:

1.看这个文件的大小 (一般同文件的Debug版要比Release版字节大小要大一些):

如左图可知:上面的是Debug版本,大小为9888字节;下面的是Release版本,大小为8528字节。

2.通过指令查看: readelf -S 想要查看的文件名 grep debug (可以测试到该文件是否具备测试功能 

        上面绿色框中的内容就是Debug版本专属的具有调试功能的文件,这也是Debug版本比Release版本体积大的主要原因!         


三.gdb调试:

试验1:以下为写好的test.c文件代码,将通过该代码文件去调试

 

调试指令1:l指令(小写L)

l+数字:显示从代码的某一行开始的内容。

注:默认显示10行内容,再次输入l键按回车便可继续显示后面的内容。

 


run指令:运行程序,相当于VS中的直接运行不调试——可简化输入r


 break指令:设置断点——指令可简化输入为b  

info b指令:查看整个代码所有的断点信息

 


next指令:单条执行,相当于VS调试工具中的逐过程功能——可简化输入n

step指令:进入函数内部,相当于VS调试工具的逐语句功能——可简化输入s

注:使用这两个指令时,只能用于断点处运行时使用。该程序没有设置断点则不能用。

设置好断点后,输入run指令:

gdb会优先进入设置好的第一个断点,它处在第10行,所以进入第10行,这时我们采用n或s指令一步一步的往下执行。

因为是循环100次,所以会来回切换语句。


continue指令:从当前位置的断点处跳到下一个断点处

 

 


 finish指令:gdb调试器自动停止调试,并且输出最终的代码执行结果。 


p+变量指令:可以查看当前变量的数值

 

如上,进入该循环中,执行完该次循环后,使用p+变量指令就能显示当前变量的数值,但只显示一次。进入下一次循环后,还需要再使用p+变量才能再看到变量的数值变化。 

 


display +变量指令:可以一直查看该变量的数值

 

         如上,每次执行s或n指令进行循环时,gdb都会自动打印每次循环的变量sum和i的值,这个指令比上面的p+变量好很多哟~

display还可以查看变量的地址:

 

 

undisplay指令:删除之前对display变量的追踪

注:undisplay 跟的只能是变量的编号,跟其他没有用,如下:

 


 

 

 bt指令:查看当前所处函数栈帧的数据


 

delete breakpoints: 删除所有断点

delete breakpoints n: 删除序号为n的断点

disable breakpoints: 禁用断点

禁用断点并不会将该断点删掉,而是会让断点失效,断点所在代码所处痕迹仍在。

enable breakpoints: 启用断点

注:上面这些指令,若不加指定断点的编号,默认是包括所有断点的禁用,删除,启用!

 

 

 删除所有断点:

 

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

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

相关文章

解析云盘存储的优缺点:安全靠谱还是存在风险?

云盘是一种基于云计算技术的在线存储服务,用户可以通过互联网将文件上传到云端,并可以随时随地通过网络访问这些文件。 相较于传统的本地存储,云盘具有以下优势: 1.数据安全性更高:云盘使用专业的云计算技术和安全措施…

安装stable-diffusion

安装流程&#xff1a; 下载stable-diffusion源码 <https://github.com/AUTOMATIC1111/stable-diffusion-webui/releases/tag/v1.2.1>安装python <https://www.python.org/ftp/python/3.10.6/python-3.10.6-amd64.exe>添加host 打开C:\Windows\System32\drivers\etc…

01Redis单线程 VS 多线程

不同版本&#xff0c;情况不同 Redis的版本很多3.x、4.x、6.x&#xff0c;版本不同架构也是不同的&#xff0c;不限定版本问是否单线程也不太严谨。 版本3.x &#xff0c;最早版本&#xff0c;也就是大家口口相传的redis是单线程 数据结构简单避免锁的开销和上下文切换可以有…

chatgpt赋能python:Python中的乘方操作

Python中的乘方操作 作为一种流行的编程语言&#xff0c;Python内置了许多强大的数学运算工具。其中&#xff0c;乘方操作是一个非常常见的数学操作&#xff0c;它可以快速地计算一个数的任意次幂。本文将介绍Python中乘方操作的用法&#xff0c;并提供了一些相关的示例代码。…

论文撰写总结与撰写心得——如何更好的产出几万字的论文

一张图开场&#xff0c;说说为什么会有本篇文章&#xff0c;因为晚上关了灯的屏幕太晃眼睛了&#xff0c;之前好几次不是哥哥我不加班帮小伙伴们搞论文&#xff0c;是当时眼睛顶不住了&#xff0c;所以这篇文章除了说一下论文的码字心得外&#xff0c;哥哥我再说一下如何在夜间…

LeetCode: 二叉树的直径(java)

二叉树的直径 leetcode 543题。原题链接题目描述解题代码二叉树专题 leetcode 543题。原题链接 543题&#xff1a;二叉树的直径 题目描述 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也…

MySQL分库分表方案及sharding-spher(1)

一、数据库瓶颈 不管是IO瓶颈&#xff0c;还是CPU瓶颈&#xff0c;最终都会导致数据库的活跃连接数增加&#xff0c;进而逼近甚至达到数据库可承载活跃连接数的阈值。在业务Service来看就是&#xff0c;可用数据库连接少甚至无连接可用。接下来就可以想象了吧&#xff08;并发…

液晶显示常用概念

文章目录 数字液晶显示消隐区水平&#xff08;行&#xff09;消隐 HBlank垂直&#xff08;场&#xff09;消隐 VBlank RGB格式RGB555RGB565RGB888 VGA驱动原理时钟信号像素时钟同步信号DE信号&#xff08;有效数据选通信号&#xff09;DE信号与其他信号的关系 数字液晶显示消隐…

【LCD应用编程】绘制点、线、矩形框

之前获取LCD屏幕参数信息时了解到&#xff0c;LCD屏是 FrameBuffer 设备&#xff0c;操作 FrameBuffer 设备 其实就是在读写 /dev/fb0 文件。除此之外&#xff0c;LCD屏上包含多个像素点&#xff0c;绘制点、线、矩形框本质是在修改这些像素点的颜色。 目录 1、定义 lcd_color…

【LeetCode】12,整数转罗马数字。 难度等级:中等。易错点:使用 python 字典构建哈希表时要考虑哈希表是否有序

文章目录 一、题目二、我的解法&#xff1a;基于有序哈希表的贪心算法2.1 使用 dict 构建哈希表2.2 使用两个 list / tuple 构建有序哈希表 一、题目 二、我的解法&#xff1a;基于有序哈希表的贪心算法 2.1 使用 dict 构建哈希表 贪心法则&#xff1a;我们每次尽量使用最大的…

面试被问麻了....

前几天组了一个软件测试面试的群&#xff0c;没想到效果直接拉满&#xff0c;看来大家对面试这块的需求还是挺迫切的。昨天我就看到群友们发的一些面经&#xff0c;感觉非常有参考价值&#xff0c;于是我就问他还有没有。 结果他给我整理了一份非常硬核的面筋&#xff0c;打开…

轻松高效!三种方法教你音频转文字!

我们在日常生活中&#xff0c;总会遇到许多需要音频转文字的情况。这个时候大部分小伙伴会选择一边播放音频一边记录的方式来整理音频的内容&#xff0c;这样既麻烦又费时&#xff0c;整理的效率也不高。其实我们只需要使用软件来协助我们将音频转换成文字&#xff0c;就可以很…

java 注解学习

Java 语言中存在三类注解&#xff0c;分别是元注解&#xff08;Meta-annotations&#xff09;、Java 内置注解&#xff08;Built-in Annotations&#xff09;和自定义注解&#xff08;Custom Annotations&#xff09;。 1、元注解&#xff08;Meta-annotations&#xff09; 元…

【PyQt5】指示灯显示

【PyQt5】指示灯显示 1、背景2、代码示例3、QtDesigner绘制1、背景 利用Qt5写工业控制软件交互界面的时候,经常需要在界面上有指示灯功能。 例如下面的明暗表示串行端口的连接和断开。 我们本质是用Qt5的label文本标签来实现的,即通过设置标签的样式表来实现的。 假设labe…

使用Windbg静态分析dump文件的一般步骤详解

目录 1、概述 2、静态分析dump文件的一般步骤 2.1、查看异常类型 2.2、使用.ecxr命令切换到发生异常的线程上下文&#xff0c;查看发生异常的那条汇编指令 2.3、使用kn/kv/kp命令查看异常发生时的函数调用堆栈 2.4、使用lm命令查看模块的时间戳&#xff0c;找到对应的pdb…

8个升级到ChatGPT Plus的理由,不升级你就out了

​关注文章下方公众号&#xff0c;可免费获取AIGC最新学习资料 导读&#xff1a;ChatGPT Plus 是 OpenAI 聊天机器人的高级付费版本。以每月 20 美元的价格&#xff0c;该服务为您提供访问 GPT-4&#xff0c;您可以享有令人难以置信的稳定性和更快的响应时间。 本文字数&#…

img[:, :, ::-1] 通俗理解

&#x1f468;‍&#x1f4bb;个人简介&#xff1a; 深度学习图像领域工作者 &#x1f389;工作总结链接&#xff1a;https://blog.csdn.net/qq_28949847/article/details/128552785 链接中主要是个人工作的总结&#xff0c;每个链接都是一些常用demo&#xff0c…

知识付费小程序搭建 为有价值的知识买单

以前我们学习写作遇到难题的时候&#xff0c;总喜欢上网搜一下参考资料&#xff0c;但是不知具体从何时起&#xff0c;很多平台内容查看都要钱了。这说明知识付费已经深入到我们的生活中了。再加上疫情爆发这几年&#xff0c;很多教育培训机构都抓住风口&#xff0c;开发了线上…

Web应用技术(第十四周/END)

本次练习基于how2j和课本,初步认识Spring。 以后我每周只写一篇Web的博客&#xff0c;所有的作业内容会在这篇博客中持续更新。。。 一、Spring基础1.Spring概述:2.Sring组成&#xff1a;3.BeanFactory&#xff1a;4.控制反转&#xff1a;5.依赖注入&#xff1a;6.JavaBean与S…

【六一 iKun】Happy LiuYi, iKuns

六一了&#xff0c;放松下。 Python iKun from turtle import * screensize(1000,1000) speed(6)#把衣服画出来&#xff0c;从右肩膀开始#领子 penup() goto(-141,-179) pensize(3) fillcolor("black") pencolor("black") begin_fill() pendown() left(1)…