Linux调试器之gdb

前言

我们前面介绍了几个基本的环境开发工具。例如通过yum我们可以安装和卸载软件、通过vim我们可以写代码、通过gcc和g++我们可以编译代码成可执行程序。但是如何在Linux下调试代码呢?我们并未介绍,本期我们将来介绍最后一个工具 --- 调试器gdb。

本期内容介绍

程序的发布方式

gdb基本的调试操作

程序的发布方式

程序的发布方式有两种:debug模式 和 release模式

gebug模式:编译的程序通常包含了额外的调试信息目的是为了方便后期维护人员的维护!在debug模式下,编译器的优化力度较小,更多的保留了原生代码的结构和信息。支持调试且通常运行速较慢!

release模式:编译的程序通常会进行各种优化,原生代码和结构会很少,目的是为了让使用者有更好的体验!在release模式下,不会添加额外的调试信息,所以在release上一般不支持调试但通常运行速度较快!

总结:debug包含调试信息,可调试但运行速度慢。release不包含调试信息但运行速度快!

这个其实我们不陌生,在VS上我们已经见过了:

Linux下的gcc/g++默认编译采用的是release模式!要让gcc/g++编译采用debug模式,需要加-g选项!!!

OK,我们来拿个栗子测试一下两者的区别:

#include <stdio.h>int add_sum(int src, int dest)
{int ret = 0;for(int i = src; i <= dest; i++){ret += i;}return ret;
}int main()
{printf("begin...\n");int src = 1;int dest = 100;int result = add_sum(src, dest);printf("result = %d\n", result);printf("end....\n");return 0;
}

我们先来写一个makfile:

我们可以的看到debug比release的要大!!原因就是debug加了调试信息!

我们也可以看看到底添加了那些东西:

readelf -S process-debug | grep -i debug

我们可以通过这条指令进行查看到底添加了什么,先看现象再解释这条指令是啥意思:

以上这就是添加的调试信息!!OK介绍一下这条指令的意思!

什么是ELF?

ELF是一种灵活的存储格式,允许数据和代码以及其他的必要信息各种不同的段并支持动态链接和加载,一般用于存储可执行文件、目标文件、共享库标准文件等。在Linux系统中被广泛的使用,这个的可执行文件就是按着这个格式存储的!

所以这里的readelf  -S process-debug是在读取process这个可执行程序的信息。后面加一个管道过滤在提取gebug的信息,-i是忽略大小写~

OK,我们上面说过release是没有添加调试信息的,我们可以来验证:

gdb基本的调试操作

启动调试:gdb binfile(二进制文件,就是可执行程序)

类似于VS中的F5

启动后命令行解释器就变成了(gdb)!!

退出gdb:quit / q

类似于VS中的shift + F5

list / l 文件名:行号或函数:依次显示从行号开始的源代码或某个函数的源代码,每次显示10行

我们这个只有一个文件直接可以这样: list / l :行号或函数

gdb是会记住最近指令的一条指令

r运行程序 

会直接运行完整个程序

但是我们这样我们也无法进行调试啊~!所以我们得设断点!

break/b 文件名:行号  ,在某一行设置断点

break/b 函数名,在某个函数的开头设置断点

只有一个文件可以直接break/b 行号/函数名

类似于VS的F9

这里断点打在行上是没有问题的,但是在函数名上为什么就不在函数名的哪一行呢??这里就需要谈谈函数了。函数实质上就是一个代码块,它的函数名我们在C语言介绍过是指针!函数名更多的作用是记录这个函数的位置方面调用的时候调到!真正的代码是在函数体内的!所以他函数名在14行断点在16行的原因!

我们知道在VS上当程序运行到断点处时会停下来,我们这里也可以验证:

果然在三号断点处停了下来,这里也就是main函数!其他没有执行的原因是main是程序的入口,在main这里就停了其他的也就未执行!OK,断点打好了如何查看呢?VS上好得可以看到有一个红点,这里如何查看?

查看断点信息:info break(b)

这里就看到了断点的信息,左边有他们独有的编号,而且这个编号是线性增长的!比如你现在把1号断点去掉,后面的也不会变化还是2和3, 1不会被占!OK这就得取消断点验证!

删除断点编号为n的断点:delete(d) n(断点编号)

删除断点全部断点:delete(d) breakpoints

OK先来把上面断点编号的介绍给验证了!

注意这里是d + 断点编号,否则可能会误操作或根本就没有这个断点编号:

删除全部断点:

使能(关闭和启用)断点:disable/enable 断点编号

OK,这个东西其实在VS也是见过的:

这里我打了三个断点,假设我现在暂时不让第一个起作用了,我们可以把这个断点禁用了:

把鼠标放到这个断点处,右键有个禁用,点击就把这个断点禁用了!它的红点就变黑了即关闭了:

同样Linux上如何做了?OK,就是disable和enable!这里我们当前的断点一个在另一个函数暂时不管:这里重新搞两个断点:

此时一个在16行一个在20行,如果16行的断点在的话会在执行r指令后停在16行:

如果我们现在不想要了,可以把这个断点给禁掉,再来看看效果:

此时他的使能显示为n,就是禁掉了!此时r就会在20行停下:

如果我现在又想要启动这个断点了,直接enable 断点编号!

类似于VS:

逐过程:next/n 
类似于VSF10

这就是一步一步的走的!我们也看到了在20行函数调用的时候他没进去!

逐语句:step/s

类似于VS的F11

很明显是逐语句走的在20行的时候进行入了add_sum函数!!!OK现在可以住语句和逐过程调试了但是上面发面我们虽然进入了函数但是咋查看每个变量的值啊?我们在VS上平时调试的时候可是可以看的!OK我们来继续介绍如何查看。

查看变量var的内容(或地址):print/p  var / p &var

但是还是有问题:

我们发现刚刚只是显示了那一次的变量的内容信息,后面的就不显示了,这不太挫了!每一次都得我手动显示?是不是不太好?所以我么来介绍常显示。

常显示变量var的内容(或地址):display var /diaplay &var

这样这些我们想要的变量信息就可以被常显示了!!!如果此时我不想要某常显示的变量了,我们该如何取消呢?

取消常显示的变量信息:undisable 编号

我们上面看到了每个常看见的变量信息是有一个独立的编号的:

我们如果不想要某个常显示的信息了,直接undisable 编号即可!

从当前断点跳到下一个断点:continue/ c

我们在VS上也很常用:例如我们在VS上:

我们当前在这个断点处,当前这块我已经检查没有错误,想到下一个断点,我们是直接F5:

Linux上是如何怎么做的呢?操作和VS的难度一样就一条指令:continue:

当前有两个断点,我们开始运行是到第一个停下,我们想到第二个断点只能s或n,这样太慢了。我们直接想到第二个断点:

运行结束当前函数就停下:finish

这里可能就有伙伴不理解为什么有这个指令呢?OK,给个场景:假设你的代码很长,里面调用了很多函数,你不知道是那个函数出问题了,你就得一个函数一个函数的找。此时你只需要走完这个函数对比预期的结果看看是否符合即可做出下一步决策!此时就有了这条指令的优势。

跳到指定行n(中间的代码都运行了):until n

查看当前函数栈帧局部变量的值:info(i) locals

类似于VS的监视窗口的局部变量

修改变量的值:set var 

假设在一个循环中,你不知道i在某一个值的时候木不符合,此时你就可以给i设置一个值判断了!

查看函数以及参数:bt(breaktrace)

OK,好兄弟本期分享就到这里,我们下期再见~!

结束语:奋斗不息,成功将至!

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

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

相关文章

DAY13|239. 滑动窗口最大值、347.前K个高频元素

239. 滑动窗口最大值、347.前 K 个高频元素 239. 滑动窗口最大值347.前 K 个高频元素 239. 滑动窗口最大值 难度有些大啊… 其实队列没有必要维护窗口里的所有元素&#xff0c;只需要维护有可能成为窗口里最大值的元素就可以了&#xff0c;同时保证队列里的元素数值是由大到小…

基于U-Net的图像分割算法介绍

U-Net是一种用于图像分割的深度学习架构,其设计初衷是用于生物医学图像分割,尤其是医学影像中的细胞分割任务。U-Net结构独特,具有编码器-解码器结构,能够有效地捕捉图像中的局部和全局信息,并在像素级别上进行精确的分割。 相关论文: U-Net: Convolutional Networks for…

密码学基础 -- 走进RSA(2)(放弃数学原理版)

目录 1.概述 2. RSA测试 2.1 加解密实验 2.2 签名验签测试 3. RSA原理简介 4.小结 1.概述 从上面密码学基础 -- 走进RSA(1)(放弃数学原理版)-CSDN博客我们知道了非对称算法的密钥对使用时机&#xff0c;那么接下里我们继续讲解RSA&#xff0c;我们分别从RSA加解密、签名验…

科大讯飞星火开源大模型iFlytekSpark-13B GPU版部署方法

星火大模型的主页&#xff1a;iFlytekSpark-13B: 讯飞星火开源-13B&#xff08;iFlytekSpark-13B&#xff09;拥有130亿参数&#xff0c;新一代认知大模型&#xff0c;一经发布&#xff0c;众多科研院所和高校便期待科大讯飞能够开源。 为了让大家使用的更加方便&#xff0c;科…

leetcode-链表中间节点

876. 链表的中间结点 题目 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释&#xff1a;链表只有一个中间…

12.MySQL应用架构演变

MySQL应用架构演变 1.总览 单机单库主从架构分库分表云数据库 2.单机单库 介绍 一个简单的小型网站或者应用背后的架构可以非常简单&#xff0c;数据存储只需要一个MySQL Instance就能满足数据读取和写入需求&#xff08;这里忽略掉了数据备份的实例&#xff09;&#xff…

三款好用的 Docker 可视化管理工具

文章目录 1、Docker Desktop1.1、介绍1.2、下载地址1.3、在Windows上安装Docker桌面1.4、启动Docker Desktop1.5、Docker相关学习网址 2、Portainer2.1、介绍2.2、安装使用 3、Docker UI3.1、介绍3.2、安装使用3.2.1、常规方式安装3.2.2、通过容器安装 Docker提供了命令行工具&…

【vue】购物车案例

change"fun"&#xff1a;元素值发生改变时&#xff0c;会触发事件fun <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale…

Qt创建基于应用程序的插件

应用程序插件 什么是插件插件的好处插件的种类应用程序插件创建应用程序的插件步骤:创建测试插件的应用程序步骤:应用程序插件示例开发环境创建示例生成插件运行结果总结什么是插件 插件是一种用于应用程序功能扩展和增强,且按照特定规范编写的应用程序接口的程序。 插件的…

linux 自定义快捷指令(docker

vi /root/.bashrc alias disdocker images alias dpsdocker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}" 保存退出后使用sourece /root/.bashrc 让其立即生效 sourece /root/.bashrc

Python学习笔记(37)——用xlwings库生成excel

老规矩先pip入xlwings库 STEP1:下载xlwings库 windowsr>>cmd>>pip install xlwings (如果需要不同版本可以到pypi上搜&#xff09; STEP2:完成EXCEL初级创建 请打开您的编写软件~~~~~&#xff08;小编的显示结果为PYCHARM编写的&#xff0c;因为颜色标注好看(…

【论文笔记】PointMamba: A Simple State Space Model for Point Cloud Analysis

原文链接&#xff1a;https://arxiv.org/abs/2402.10739 1. 引言 基于Transformer的点云分析方法有二次时空复杂度&#xff0c;一些方法通过限制感受野降低计算。这引出了一个问题&#xff1a;如何设计方法实现线性复杂度并有全局感受野。 状态空间模型&#xff08;SSM&…

蓝桥杯 — — 纯质数

纯质数 题目&#xff1a; 思路&#xff1a; 一个最简单的思路就是枚举出所有的质数&#xff0c;然后再判断这个质数是否是一个纯质数。 枚举出所有的质数&#xff1a; 可以使用常规的暴力求解法&#xff0c;其时间复杂度为&#xff08; O ( N N ) O(N\sqrt{N}) O(NN ​)&…

SQL12 获取每个部门中当前员工薪水最高的相关信息

题目&#xff1a;获取每个部门中当前员工薪水最高的相关信息 注意了&#xff0c;这道题目&#xff0c;分组函数只能查出来&#xff1a;每个部门的最高薪水&#xff0c;group by dept_no &#xff0c;根据部门分组&#xff0c;绝对不能group by dept_no,emp_no&#xff0c;不能…

学习一门语言的方法和套路(B站转述)

视频链接 up虽然长相英(ping)俊(ping)&#xff0c;但是讲的干活&#xff0c;没恰饭。 学习流程&#xff1a; 1.快速阅读&#xff0c;掌握概况 2.深入细节内容 例如&#xff1a;java (JDBC)、html 、netty 不管三七二十一&#xff0c;先了解套路&#xff0c;再深入研究。 高…

2024软考中项考哪个版本?应该该如何备考?

2024年1月&#xff0c;备受瞩目的软考中级系统集成项目管理工程师官方教程终于迎来了久违的大改版。为确保广大考生能够有充足的准备时间&#xff0c;软考中项的考试时间被顺延至同年11月&#xff0c;届时&#xff0c;这也将成为软考中项首次依据第3版考纲进行的考试。 新教材核…

非线性特征曲线线性化插补器(CODESYS 完整ST代码)

1、如何利用博途PLC和信捷PLC实现非线性特征曲线的线性化可以参考下面文章链接: 非线性特征曲线线性化(插补功能块SCL源代码+C代码)_scl直线插补程序-CSDN博客文章浏览阅读382次。信捷PLC压力闭环控制应用(C语言完整PD、PID源代码)_RXXW_Dor的博客-CSDN博客闭环控制的系列文章…

【Canvas与艺术】绘制磨砂黄铜材质Premium Quality徽章

【关键点】 渐变色的使用、斜纹的实现、底图的寻觅 【成果图】 ​​​​​​​ 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><tit…

计算机网络:数据链路层 - CSMA/CA协议

计算机网络&#xff1a;数据链路层 - CSMA/CA协议 CSMA/CA概述帧间间隔工作原理退避算法虚拟载波监听 CSMA/CA概述 讲解CSMA/CA之前&#xff0c;我们回顾一下CSMA/CD的三个特性&#xff1a; 多址接入MA&#xff1a;多个主机连接在一条总线上&#xff0c;竞争使用总线 载波监听…

腾讯云轻量应用服务器端口开启教程

腾讯云轻量应用服务器端口怎么打开&#xff1f;在轻量应用服务器控制台的防火墙中开启端口&#xff0c;本文腾讯云百科txybk.com以80端口为例&#xff0c;来详细说下轻量应用服务器端口打开教程&#xff0c;另外可以在腾讯云百科 txy.wiki 查看当前轻量服务器最新的优惠券和配置…