【Linux】调试器gdb的使用

news2024/11/20 14:40:40

​🌠 作者:@阿亮joy.
🎆专栏:《学会Linux》
🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根
在这里插入图片描述

目录

    • 👉什么是gdb👈
    • 👉gdb的使用👈
      • 查看代码
      • 设置断点
      • 查看断点
      • 删除断点
      • 执行当前被调试的程序
      • 逐过程调试代码
      • 逐语句调试代码
      • 跳转到下一个断点
      • 查看函数调用堆栈
      • 将函数直接执行完(重点)
      • 查看变量的值和地址
      • 跳转至某一行
      • 设置变量的值
      • 查看当前栈帧局部变量的值
      • 使能断点
    • 👉总结👈

👉什么是gdb👈

在实际开发过程汇总,C / C++ 的代码除了符合最基本的语法规范之外,还必须符合设计者的逻辑意图,如果发现生成的可执行程序的运行结果不对,则可以通过相应的调试环境来跟踪调试,Linux 提供了一个称为 gdb 的调试程序,其是 GNU 开发并发布的 UNIX / Linux 下的程序调试工具,能在运行时观察程序的内部结构和内存的使用情况,主要提供以下一些功能:

  • 监视程序中变量的值
  • 设置断点以使程序在指定的代买行上停止执行
  • 一行一行地执行代码

gdb 是一个功能强大的调试器,其支持的调试命令十分丰富,可以实现不同的功能。这些命令包括从简单的问价装入到允许检查所调用的堆栈内容的复杂命令。

那我想问:gdb 调试器的使用和 在 Visual Studio 上的调试有什么区别呢?其实在调试思路上,没有什么区别;而在调试的操作方法上肯定是有所区别的,Visual Studio 上的调试是通过图形化界面加快捷键来实现的,而 gdb 的调试是纯命令行的。

👉gdb的使用👈

为了介绍 gdb 常用的命令,我们写一份 0 到 100 之和的代码且故意将其写错。

在这里插入图片描述
time 函数返回当前时间的时间戳

在这里插入图片描述
写好 Makefile,然后开始编译并运行我们的代码。

在这里插入图片描述
可以看到,运行结果并不是我们想要的。所以我们需要借助调试器 gdb 来帮我们找出错误。

sudo yum install -y gdb #安装gdb

在这里插入图片描述
通过上图可以看到,我们的程序里没有调试信息。因为在 Linux 中,用 gcc / g++ 生成的可执行程序默认是 release 版本的,而 release 版本是没有调试信息的,只有 debug 版本才会有调试信息。那么,我们就需要让 gcc 生成 debug 版本的可执行程序,而我们只需要修改 Makefile 就行了。

在这里插入图片描述

注:"-g"选项在可执行程序中加入调试信息,方便进行程序的调试。

为什么软件有 debug 版本和 release 版本呢?debug 版本的软件是让程序员进行调试的,程序员调试完成后才会有 release 版本的软件。release 版本的软件是给用户使用的,该软件不需要加入任何的调试信息,因为用户根本就不会关系这些,用户只关注软件怎么用和好不好用。因为 debug 版本中带有调试信息,所以 debug 版本的软件体积一定是大于 release 版本的。

在这里插入图片描述

补充知识:可执行程序是 elf 格式的,我们可以使用 readelf 来查看可执行程序的相关信息。

readelf -S 可执行程序 #查看可执行程序的相关信息

如果用 readelf 工具来查看 debug 版本和 release 版本的软件,我们会发现 debug 版本的软件多了一些调试信息。

在这里插入图片描述

注:要用 gdb 调试代码,首先要进行给编译器 gcc 添加 “-g” 选项标识以 debug 的版本进行发布。

查看代码

gdb 可执行程序名 #进入调试
l #显示代码
l 0 #从第一行开始显示代码
list 0 #从第一行开始显示代码
q #退出调试

注:输入l 0 命令显示代码时,不需要再次输入命令,可以直接摁下回车键,就可以显示剩下的代码。因为 gdb 会记住曾经的命令。

在这里插入图片描述

设置断点

b 行号 #在该行设置断点
break 行号 #在该行设置断点

在这里插入图片描述

查看断点

info b #查看断点
info break #查看断点

在这里插入图片描述

删除断点

d 断点编号 #删除该断点

在这里插入图片描述

执行当前被调试的程序

r / run #执行当前被调试的程序

在这里插入图片描述

逐过程调试代码

n / next #逐过程调试代码(执行一行源代码但不进入函数内部)

在这里插入图片描述

逐语句调试代码

s / step #逐语句调试代码(执行一行源代码且进入函数内部)

在这里插入图片描述

在这里插入图片描述

跳转到下一个断点

为了演示这个指令,我们在原来的代码中增加一些代码。
在这里插入图片描述

c / continue #跳转到下一个断点

在这里插入图片描述

查看函数调用堆栈

在这里插入图片描述

将函数直接执行完(重点)

finish #将整个函数直接执行完,不是逐语句也不是逐过程地执行

在这里插入图片描述

注:该命令比较重要,如果将该函数直接跑完且返回结果有误,则错误出现在该函数内。这样,我们就可以快速地将错误定位到该函数了。

查看变量的值和地址

p 变量名 #查看变量的值
p &变量名 #查看变量的地址
display 变量名 #将变量加入显示窗口中
undisplag 编号 #将变量移出显示窗口

在这里插入图片描述

在这里插入图片描述

跳转至某一行

until 行号 #跳转至指定行

在这里插入图片描述
注:如果指定行没有有效的代码,其会跳转到下一句有效代码处。

设置变量的值

set var 变量名=数字 #将变量的值设置为指定值

在这里插入图片描述
注:将变量的值设置为指定值后,代码的运行结果可能会不正确。

查看当前栈帧局部变量的值

info locals #查看当前函数栈帧的局部变量的值

在这里插入图片描述

使能断点

disable breakpoints 断点编号 #使该断点失效
enable 断点编号 #使该断点生效

在这里插入图片描述

👉总结👈

本篇博客主要讲解了什么是 gbd以及 gdb 的常见命令。那么以上就是本篇博客的全部内容了,如果大家觉得有收获的话,可以点个三连支持一下!谢谢大家!💖💝❣️

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

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

相关文章

2022-忙碌的一年

(点击即可听音频)前言花有重开日,人无再少年.每当这个时候,回头驻足,不是感慨万千,就是惜时如金,一年悄无声息的从指尖划过,星海横流,岁月如碑.那些被偷走的时光,发生了大大小小的事无论是平淡无奇,还是历久难忘,有惊喜,有遗憾,终将都会隐入尘烟。大到国…

自定义coco数据集

1、环境 anaconda环境安装配置 2、工具 安装labelme工具 3、安装软件 3.1、打开anaconda控制台 3.2、创建虚拟环境 conda create -n labelme python3.73.3、激活环境 conda activate labelme3.4、下载labelme pip install labelme3.5、输入labelme打开软件 以后打开跳…

微信小程序--P2P消息收发模式(MQTT)

目录 前言 js demo 参数 new Paho.Client 创建对象 onConnectionLost 连接丢失回调 onMessageArrived 监听数据 connect (connectOptions)将此消息客户端连接到其服务器。 mqtt 频繁断开和重连问题 小程序实践 前言 P2P,顾名思义,是一对一的消…

vTESTstudio入门到精通 - vTESTstudio工具栏介绍_Layout

到今天这一篇vTESTstudio工具栏介绍就将暂时告一段落了,后续如果大家有需求的话可以私信我,我就继续再往深的介绍,如果没有催更的话,就当这部分是给大家做个普及,作为一个扫盲篇吧,实际项目使用和编程的内容…

Nginx反向代理的一个算法API的接口调用超时:504,GateWay Timeout,怎么破?

背景 服务端由第三方部署了一个基于 darknet (一个较为轻型的完全基于C与CUDA的开源深度学习框架)的识别算法服务,通过 Flask 的 Web 服务对业务服务暴露 API 接口。作为测试,一开始是直接通过 python3 app.py 的命令行启动的服务…

SAP Product Lifecycle Costing 里的 Costing Sheet 成本核算表

有朋友在我的知识星球里向我提问: 请您帮忙讲一下这个AP0100的costing sheet rows这里都表示什么意思吗?比如row10、base Z010、overhead啥、描述、from、to row、credit都说明了什么,能够实现上面👆🏻的目标吗&#x…

【详细学习SpringBoot源码之属性配置文件加载原理(Bootstrap.properties|Bootstrap.yml)-8】

一.知识回顾 【0.SpringBoot专栏的相关文章都在这里哟,后续更多的文章内容可以点击查看】 【1.SpringBoot初识之Spring注解发展流程以及常用的Spring和SpringBoot注解】 【2.SpringBoot自动装配之SPI机制&SPI案例实操学习&SPI机制核心源码学习】 【3.详细学…

Transformer图解

Transformer正在席卷自然语言处理领域。 这些令人难以置信的模型正在打破多项 NLP 记录并推动最先进的技术发展。 它们被用于许多应用程序,如机器语言翻译、会话聊天机器人,甚至为更好的搜索引擎提供动力。 Transformer在当今深度学习领域风靡一时&…

POSTGRESQL 13.1 bug 与 逻辑复制槽参数调优

随着问问题的同学越来越多,公众号内部私信回答问题已经很困难了,所以建立了一个群,关于各种数据库的问题都可以,目前主要是 POSTGRESQL, MYSQL ,MONGODB ,POLARDB ,REDIS,SQL SERVER 等,期待你的加入&#…

pytorch 多卡运行详细教程

先说明一下背景,目前正在魔改以下这篇论文的代码: https://github.com/QipengGuo/GraphWriter-DGLgithub.com 由于每次完成实验需要5个小时(baseline),自己的模型需要更久(2倍),非…

战略和什么相关?

(1)战略和创新企业做到最大,就是业务多元化/一体化、区域全球化。想再折腾折腾,那就手里这几张牌搞重新排列组合,这就是:企业再造。就是中国人说的:天下大势分久必合合久必分。按照波士顿咨询来…

20221224英语学习

今日词汇 lash v.将(物品)系牢,捆绑;(风、雨等)猛烈打击;鞭打;猛烈抨击,严厉斥责 detective n.侦探; 警探; 发掘者; 发现者 division n.分开; 分隔; 分配; 分隔物; 刻…

深度学习SSD算法

目录1 SSD网络结构1.1 backbone1.2 extra部分1.3 loc和cls1.3.1 PriorBox层先验框的生成方法1.3.2 loc的预测结果2 模型训练2.1 正负样本标记2.2 损失函数2.3 困难样本挖掘3 模型预测4 总结1 SSD网络结构 SSD是YOLO V1出来后,YOLO V2出来前的一款One-stage目标检测…

Linux0.11 考古笔记

Linux0.11 考古笔记 最近读完《Linux 内核完全注释》和《品读 Linux0.11 核心代码》,大致理解下 Linux0.11 内核的全貌。在我理解这些属于计算机基础类的知识,所以在未来的工作场景不太可能会直接用到它们,如果用不到的话这些知识可能会随着…

从 2022 年优秀 Linux 发行版中挑选你喜欢的版本

导读如果你想从 2022 年最佳 Linux 发行版列表中挑选一个最喜欢的版本,那么今天你需要考虑以下几个选项。 2022 年是充满惊喜的一年,Linux 发行版的表现也不例外。从充满功能的新版本到各种桌面选项,总有一些值得期待的东西。 如果你想从 20…

自制macOS安装镜像iso虚拟机用

在网上下载的用于在虚拟机中安装的镜像版本相对比较旧。安装完成后还要进行升级比较麻烦。于是我就想自己制作安装镜像了。 精华 #创建空白磁盘镜像 hdiutil create -o /tmp/ventura -size 13800m -volname ventura -layout SPUD -fs HFSJ #挂载上面创建的镜像 hdiutil attac…

【Java 数据结构】-二叉树OJ题

作者:学Java的冬瓜 博客主页:☀冬瓜的博客🌙 专栏:【Java 数据结构】 分享:宇宙的最可理解之处在于它是不可理解的,宇宙的最不可理解之处在于它是可理解的。——《乡村教师》 主要内容:二叉树的…

离职时,是在公司群里大方告别,主动退群?还是一言不发,默默退出?

离职时怎么体面退出工作群?一位网友说,自己公司的同事离职那天,在公司群里发了一大段感谢的话,大大方方挥手告别后主动退了群。有同事夸这个离职的人情商高,这样告别大方得体,是离职的好表率。但楼主觉得&a…

SAP UI5 加载本地并不存在的 PDF 文件的错误处理

这个 _onLoadListener 函数什么时候注册的呢? iframe 完成加载之后,就触发这个 load 事件注册的处理函数: PDFViewer.prototype.onAfterRendering function () {var fnInitIframeElement function () {// cant use attachBrowserEvent be…

vue后台管理系统项目-vue-quill-editor实现富文本编辑器功能 可直接使用

富文本编辑器功能实现详细过程 目录 富文本编辑器功能实现详细过程 1.安装富文本插件 2.实现效果 3.实现详细过程 可直接使用 全局引入 局部引入 配置option 扩展需求 自定义配置文字大小 1.安装富文本插件 npm install vue-quill-editor --save //或者 yarn add vu…