gdb的使用

news2024/11/27 1:18:10

目录

  gdb工具的使用

  代码调试相关指令

运行程序指令 r

    显示代码的指令 l

  给代码打断点 b

  查看断点位置 info b

  执行代码到断点处停止 

  关闭断点 d+断点编号

  关闭某个断点,但不删除 disable+编号

  打开某个断点 enable+断点编号

  逐过程调试代码 n

  逐语句调试代码 s

    查看某个变量的值 p+想要查看的变量名

  常显示变量的值 display+想要查看的变量名

  关闭常显示 undisplay+对应的编号

  在我们编写代码的过程当中我们肯定会遇到程序运行的结果不符合预期的情况,这个时候我们就需要通过调试代码找到错误,并进行修改。

  在平时的程序编写的时候我们使用的都是VS2019集成开发软件,其中已经封装了图形化界面的调试方案。可以很好的帮助我们进行代码的调试。但是在Linux系统当中,我们要想对代码进行调试就需要使用我们的调试工具,并通过特定的指令进行代码的调试以及运行。

  在本次的博客当中我们将对比在VS2019环境当中的代码调试步骤以及在Linux当中的代码调试步骤,帮助我们学习gdb代码调试工具。

  gdb工具的使用

  在使用gdb进行代码调试之前我们需要认识一下运行代码的两种形式:debug模式和release模式。这两个版本的代码的区别就在于debug模式允许我们对代码进行调试,但是release模式下不允许对代码进行调试。

  因为release模式是针对于用户使用的。我们的用户只需要使用完好的软件,并不需要对软件进行调试寻找错误。因此为了减少我们软件所占的空间会减少一些内容,这一部分减少的内容就是我们debug文件当中所蕴含的调试信息。也正是因为有了这些调试信息我们的程序才可以允许我们进行调试。

  在使用gdb对代码进行调试之前我们需要创建一个C语言文件。

  将我们编写完成的代码通过gcc进行编译之后会生成我们的可执行程序,但是这个可执行程序是release版本的,并不是在所有的Linux平台当中都可以直接使用gdb进行调试。我们需要在编译的时候加上-g选项,生成一个debug版本的可执行程序。

  通过观察可以看出debug版本下的可执行程序确实比release文件的体积要大,也符合添加了调试信息的原理。

  之后就可以使用gdb对代码进行调试了。

  其中for bug reporting instruction的含义是用于错误报告说明,表示我们已经成功进入了代码调试界面,接下来我们就来对比VS当中的调试功能进行学习Linux当中的代码调试指令。

  代码调试相关指令

  同样的我们在VS 当中也创建一个test.c文件。

运行程序指令 r

  当我们想要运行我们的代码的时候,在VS2019当中我们可以按ctrl+F5组合键快速执行。

  与之相对应的gdb当中我们直接输入r命令也可以得到相同的效果。

  由于在Linux平台下面没有图形化界面所以会直接显示我们程序执行的结果,如上图所示。

    显示代码的指令 l

  由于在VS当中我们对一段代码进行调试的时候并不会关闭我们的代码,所以我们并没有显示代码的功能。但是在Linux当中这个功能就显得很必要了,有时候我们的代码比较长,那么就需要一边看着代码以便进行调试,这样才可以更好的进行调试功能。示例如下:

  我们可以在 l 后面跟上我们想要显示代码的行号,这样就可以显示我们想要的目标代码。同时gdb具有记忆功能,我们在输入一次指令之后,就可以重复上一次输入的指令,不必再重复进行输入。因此我们只需要输入一次 l 0 之后直接按回车就会得到我们的全部代码。

  给代码打断点 b

  在对代码进行调试的时候,我们经常会用到给代码打断点的作用。这样可以快速让我们的代码跳转到指定的位置上。在VS2019当中也同样具有这样的功能,我们只需要在代码行左端的位置按左键点击一下,就会显示一个红点,这就是我们对代码打的断点。  例如我们在上面第8行的位置上打了一个断点。如果想要执行代码到断点的位置出停止,我们只需要点击F5就可以了。

  当我们的界面跳转到这样就说明VS软件已经进入调试模式。

  而在gdb当中我们要想给代码在一个特定的位置打一个断点需要使用 b 指令,b 代表着 break 我们可以通过 b + 行号 在指定行的位置上给代码打好断点。例如:

  就像我们上图中所示的内容一样,输入指令之后就会显示我们在哪一个文件当中第几行打上了断点。

  查看断点位置 info b

  既然打上了断点万一忘记了应该怎么办呢?怎么查看我们在什么位置打了断点呢?在VS当中由于图形化界面的应用,我们只需要拖动我们的鼠标就可以看到我们打断点的位置。但是在Linux平台下面我们就需要继续输入指令了,这个时候就用到了info b指令,执行效果如下:

  我们会发现我们上面依次打的三个断点,不仅可以查看而且他们已经被编号序号。

  执行代码到断点处停止 

  在VS当中要想执行代码到断点的位置停止,我们只需要点击F5按键即可,要想跳转到下一个断点的位置我们只需要继续点击F5按键就可以实现。

  但是gdb好像就没有这么方便了,我们第一次下个要执行代码到第一个断点的位置处停止,我们就需要输入 r 命令即可。

  输入r命令之后我们的程序就会执行到我们第一个断点的位置处然后停止。如果继续输入 r 指令呢?

  当我们第二次输入的命令之后,我们会发现我们的代码重新开始运行了。并没有按照我们的预期执行到我们的断点处停止。所以要是想要跳转到第二个断点的位置处停止,我们可以输入 c 指令。

  我们会发现我们输入c指令之后断点数会逐步增加,也就对应着我们断点之间的跳转。

  关闭断点 d+断点编号

  学会添加并且跳转断点之后,下一步就需要进行断点的删除。在VS2019当中,删除一个断点只需要再次点击即可。

  在gdb当中我们想要删除一个断点需要输入 d+断点编号的指令。例如:

  我们先通过info b指令查看断点,之后通过d+断点编号的命令删除断点,最后通过info b命令进行查看,我们会发现我们的断点和我们的预期一样被删除了。

  关闭某个断点,但不删除 disable+编号

  当我们想要暂时屏蔽某个断点的时候在VS2019当中我们需要单击右键,然后选择禁用断点,当我们的断点颜色变白的时候我们这个断点就已经被禁用完毕了。我们再次按F5就会直接跳到下一个断点的位置处。

  而在gdb当中想要完成这个功能我们需要输入disable+断点编号的命令来关闭一个断点。

  我们只需要观察info b当中的信息,其中disp 就表示是否启用该断点,如果启用就表示为y,否则就表示为n。

  打开某个断点 enable+断点编号

  想要打开某个断点我们在VS当中需要执行重复的操作,右键单击禁用的断点之后点击启用断点即可达到目标效果。

  而在gdb当中我么需要输入enable+断点编号的指令,打开某个关闭的断点。示例如下:

  输入指定的指令之后就会发现我们禁用的指令已经打开了。

  逐过程调试代码 n

  常用的代码调试的方式其实是一步一步的调试,当我们的程序运行到大致的位置的时候,通常情况下我们会使用一步一步进行执行的方式得到调试的结果。逐过程调试也就是不进入我们的函数当中,将函数看作是一个整体,直接得到返回值。在VS当中就相当于我们的F10操作。点击之后,会运行到代码的下一步,但是不会进入函数当中。

  我们会发现我们按F10之后程序没有进入函数当中直接跳到了下一行。

  在gdb调试当中要想执行相应的步骤,我们需要输入 n 指令。发挥的是相同的作用。

  在17行的位置打一个断点,之后运行代码,程序就运行到了第17行的位置。之后我们输入n指令,代码就跳到了第18行的位置,不进入函数。

  逐语句调试代码 s

  和逐过程调试代码相对应的就是逐语句调试代码,和逐过程最大的区别就在于逐语句调试代码最大的特点就在于会进入函数当中,我们可以看到函数当中的运行过程,方便我们进一步对代码进行调试操作。在VS2019当中我们只需要点击F11就可以执行逐语句调试代码的效果。例如:

  在gdb当中逐语句调试代码需要输入 s 指令,所发挥的作用同样是进入到函数中进行调试等操作。例如:

   我们会发现同样的操作,我们输入 s 会直接进入到函数内部,如果下一条指令不是函数就会正常的跳转到下一条代码的位置。

    查看某个变量的值 p+想要查看的变量名

  学会了调试的步骤之后我们会很好奇,但是我们还是不知道我们变量的值呀。在VS当中我们可以通过监视窗口观察我们想要查看的变量值。例如:

  我们在右边输入的变量的值会随着程序的运行而变化,这也很好的帮助了我们检查代码到底是运行到了那一步出了问题。

  在gdb当中我们要想查看某一个变量的值就需要输入 p+想要查看的变量名 这样就可以查看到指定的变量的值了。测试效果如下:

  当我们输入指令查看sum变量的值的时候,我们会发现刚开始sum的值为0,但是随着我们程序的执行再次查看变量的值就变成了6。

  常显示变量的值 display+想要查看的变量名

  但是我们会发现gdb当中的查看变量的值的使用方式并不方便,我们每一次都得重新输入一次p指令才可以得到想要的结果。所以为了解决我们上面所出现的问题,就有了常显示变量的值,我们就需要输入display+想要查看的变量名的指令进行查看。测试效果如下:

  我们会发现,当我们输入指令之后在下方就会自动输出一个sum变量,并且这个变量会随着我们程序的执行而改变。

  关闭常显示 undisplay+对应的编号

  当我们不想使用常显示的时候我们需要输入undisplay+该变量对应的编号的指令进行取消常显示。对应的编号也就是我们为常显示变量分配的编号。就比如图中sum的编号就为1。测试指令的运行效果如下:

  输入玩相应的指令之后,我们会发现我们的sum常显示也就被取消了。

  那么此上就是gdb当中最常用到的关于调试的相关指令了,我们平时需要多多练习,等熟练了之后我们可以将目光转向更为方便的具有图形化界面的调试工具。

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

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

相关文章

【外设】拓展坞接入外设一直弹窗报错问题

外设相关:多功能拓展坞安装后使用正常但计算机一直弹窗报错 1.基本配置信息: 拓展坞:绿联6合1 笔记本:lenovo (硬件:13^i5;系统:win11) 外设:1键1鼠1显示器1硬盘 2.存在的问题&am…

LNK2001: unresolved external symbol __imp___std_init_once_begin_initialize 问题解决

LNK2001: unresolved external symbol __imp___std_init_once_begin_initialize 解决 文章目录 问题背景方法一:使用预编译指令方法二:使用相同的环境 参考链接附录 问题背景 Visual Studio 2019 对 CMakeLists.txt 的支持不是很好,使用 “文…

【单片机】12-串口通信和RS485

1.通信有关的常见概念 区分:串口,COM口,UART,USART_usart和串口区别-CSDN博客 串口、COM口、UART口, TTL、RS-232、RS-485区别详解-CSDN博客 1.什么是通信 (1)人和人之间的通信:说话&#xff…

java项目之校园餐厅管理(ssm源码+文档)

项目简介 校园餐厅管理实现了以下功能: 管理员:个人中心、商家管理、用户管理、菜系类别管理、校园美食管理、在线下单管理、美食论坛、系统管理。商家前台:首页、校园美食、论坛信息、新闻资讯、我的、跳转到后台、客服。商家:…

第4讲:vue内置命令(文本插值,属性绑定,v-text,v-html)

MVVM 什么是MVVM? MVVM是Model-View-ViewModel的简写。它本质上就是MVC 的改进版。MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开。 View层: 视图层 在我们前端开发中,通常就是 DOM 层。 主要的作用是…

Error: Activity class {xxx.java} does not exist

git切换到不同的branch之后,报下面的错误: Error: Activity class {xxx.java} does not exist 解决方案: 首先clean 然后会删除build目录 然后点击:Invalidate Caches Android Studio重启,然后重新build即可。

四、2023.9.30.C++面向对象end.4

文章目录 49、 简述一下什么是常函数,有什么作用?50、 说说什么是虚继承,解决什么问题,如何实现?51、简述一下虚函数和纯虚函数,以及实现原理?52、说说纯虚函数能实例化吗,为什么&am…

Python实验二

1:编程计算 1~100 偶数的和。 要求:输出结果为整数,宽度为 8,居中对齐,空白处填充符号“*”。 提示: range(2,101,2)生成的整数列表从 2 开始到 100 结束,步长为 2,即 …

华为云云耀云服务器L实例评测|云耀云服务器L实例部署Linux管理面板mdserver-web

华为云云耀云服务器L实例评测|云耀云服务器L实例部署Linux管理面板mdserver-webl 一、云耀云服务器L实例介绍1.1 云耀云服务器L实例简介1.2 云耀云服务器L实例特点 二、mdserver-web介绍2.1 mdserver-web简介2.2 mdserver-web特点2.3 主要插件介绍 三、本次实践介绍…

高数:第二章:一元函数微分学

文章目录 一、导数与微分1.导数的概念(1)导数的定义(2)左右导数(3)定理:可导与左右导数的关系(4)可导三要素(5)用导数定义判断可导性 2.微分的概念(1)微分的定义(2)微分与可导的关系 3.导数与微分的几何意义(1)导数 f ′ ( x 0 ) f(x_0) f′(x0​)的几何意义&#x…

【LLM】Windows10环境部署阿里通义千问大模型(Qwen-14B-Chat-Int4)

文章目录 环境文件准备项目代码模型相关文件 运行准备工作运行demo Tips 环境 系统版本:Windows 10 企业版 版本号:20H2 系统类型:64 位操作系统, 基于 x64 的处理器 处理器:Intel Core™ i7-13700K CPU 3.40GHz 机带 RAM&#…

1340. 跳跃游戏 V;2039. 网络空闲的时刻;2767. 将字符串分割为最少的美丽子字符串

1340. 跳跃游戏 V 核心思想:动态规划记忆化搜索。定义dfs(i),表示从i开始最多可以访问多少个下标,然后统计往左跳和往右边跳的最大值,思路其实比较简单,但是代码我感觉还是不太好想。 2039. 网络空闲的时刻 核心思想…

CH347读写SPI Flash

CH347读写SPI Flash 前面耽搁了几天,今天终于把CH347 SPI接口调试好了。 CH347动态库中SPI接口函数如下: typedef struct _SPI_CONFIG{UCHAR iMode; // 0-3:SPI Mode0/1/2/3UCHAR iClock; // 060…

数据分析方法:RFM模型

一、RFM基本原理 RFM是三个单词的缩写: 最近一次消费时间(Recency),取数的时候一般取最近一次消费记录到当前时间的间隔,比如:7天、30天、90天未到店消费;直观上,一个用户太久不到…

Windows 下安装及配置 MySQL 8.1 (图文教程)

目录 下载 MySQL安装 MySQL配置 MySQL修改密码配置环境变量 卸载 MySQL开源项目微服务商城项目前后端分离项目 下载 MySQL 访问 MySQL 下载地址:https://dev.mysql.com/downloads/mysql/ 下载 MySQL 时,你可以选择 ZIP 包或 MSI 安装: ZIP包…

智能合约漏洞,Dyna 事件分析

智能合约漏洞,Dyna 事件分析 1. 漏洞简介 https://twitter.com/BlockSecTeam/status/1628319536117153794 https://twitter.com/BeosinAlert/status/1628301635834486784 2. 相关地址或交易 攻击交易 1: https://bscscan.com/tx/0x7fa89d869fd1b89e…

【Java 进阶篇】MySQL 事务详解

在数据库管理中,事务是一组SQL语句的执行单元,它们被视为一个整体。事务的主要目标是保持数据库的一致性和完整性,即要么所有SQL语句都成功执行,要么所有SQL语句都不执行。在MySQL中,事务起到了非常重要的作用&#xf…

【C++】map、set,multiset和multimap的使用及底层原理【完整版】

目录 一、map和set的使用 1、序列式容器和关联式容器 2、set的使用讲解 3、map的使用讲解 二、multiset和multimap 1、multiset和multimap的使用 2、OJ题:前k个高频单词 一、map和set的使用 1、序列式容器和关联式容器 序列式容器:vector/list/s…

java遇到的问题

java遇到的问题 Tomcat与JDK版本问题 当使用Tomcat10的版本用于springmvc借用浏览器调试时,使用JDK8浏览器会报异常。 需要JDK17(可以配置多个JDK环境,切换使用)才可以使用,配置为JAVA_HOME路径,否则&a…

Linux系统编程系列之进程间通信-消息队列

一、什么是消息队列 消息队列是system-V三种IPC对象之一,是进程间通信的一种方式。 二、消息队列的特性 允许发送的数据携带类型(指定发送给谁),具有相同类型的数据在消息队列内部排队,读取的时候也要指定类型&#x…