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.rhkb.cn/news/309277.html

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

相关文章

Tomcat服务器入门介及用postman工具简单接收数据 2024详解

Tomcat服务器 简介 Tomcat是一个开源的Servlet容器&#xff0c;也是一个支持Java Servlet和JSP技术的Web服务器。它由Apache软件基金会开发和维护。Tomcat的主要作用是将Java Servlet和JavaServer Pages&#xff08;JSP&#xff09;等动态网页技术部署到服务器上&#xff0c;…

基于Python豆瓣电影数据可视化分析系统的设计与实现

大数据可视化项目——基于Python豆瓣电影数据可视化分析系统的设计与实现 2024最新项目 项目介绍 本项目旨在通过对豆瓣电影数据进行综合分析与可视化展示&#xff0c;构建一个基于Python的大数据可视化系统。通过数据爬取收集、清洗、分析豆瓣电影数据&#xff0c;我们提供了…

13.多通道视频流缓存以及显示架构

1 简介 多通道视频流缓存以及显示架构是一个在数字图像处理中很基础也很重要的一个架构。在图像拼接以及高分辨率图像显示方面应用范围较为广泛。本文将介绍一个四通道的图像显示。可以四个图像信息输入以及拼接到一个显示屏里面。使用的开发板为A7 2 框架图 架构图如下图所示…

4/11 QT_day5

服务器端 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> #include <QMessageBox> #include <QTcpSocket> #include <QList> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass …

专题十三、预处理器

预处理器 1. 预处理器的工作原理2. 预处理指令3. 宏定义3.1 简单的宏3.2 带参数的宏3.3 # 运算符3.4 ## 运算符3.5 宏的通用属性3.6 宏定义中的圆括号3.7 创建较长的宏3.8 预定义宏3.9 C99 中新增的预定义宏3.10 空的宏参数3.11 参数个数可变的宏3.12 __func__ 标识符 4. 条件编…

SAP SD学习笔记06 - 受注的据否,受注的理由,简易变更(一括处理)

上文讲了一括处理和Block&#xff08;冻结&#xff09;处理。 SAP SD学习笔记05 - SD中的一括处理&#xff08;集中处理&#xff09;&#xff0c;出荷和请求的冻结&#xff08;替代实现承认功能&#xff09;-CSDN博客 本章继续讲SAP的流程中一些常用的操作。 1&#xff0c;受注…

IoC与Spring

目录 IoC控制反转 现实案例 特点 目的 DI依赖注入 小总结 介绍Spring 狭义和广义上的Spring 传统编码方式的不足 需求引入 弊端分析 IoC控制反转 现实案例 1、买水果问老板各种水果的口感而不是自己去挨个尝试一遍。 2、买房子找中介而不是自己去花时间找房东。…

.cur 鼠标光标编辑器

详解透明贴图和三元光栅操作 - CodeBus 鼠标指针文件格式解析——Windows&#xff08;二&#xff09; (qq.com) [C/C] RGBA数组生成Windows下的ico文件_c ico格式-CSDN博客 色环设计 - CodeBus 左键绘制 右键选颜色 ctrl右键设置鼠标热点 F1导出.cur文件 //代码来源&…

Unity类银河恶魔城学习记录12-14 p136 Merge Skill Tree with Sword skill源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili CharacterStats.cs using System.Collections; using System.Collections.…

代码随想录算法训练营第三十七天|738.单调递增的数字、968.监控二叉树

代码随想录算法训练营第三十七天|738.单调递增的数字、968.监控二叉树 738.单调递增的数字 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈…

Finetuning vs. Prompting:大语言模型两种使用方式

目录 前言1. 对于大型语言模型的两种不同期待2. Finetune(专才)3. Prompt(通才)3.1 In-context Learning3.2 Instruction-tuning3.3 Chain of Thought(COT) Prompting3.4 用机器来找Prompt 总结参考 前言 这里和大家分享下关于大语言模型的两种使用方式&#xff0c;一种是 Fine…

英语技术会议常用语

个人整理。 自我介绍&#xff1a; Hello everyone, Im [Your Name], and Im excited to be here today. I work as [Your Position] at [Your Company/Organization], where I focus on [Brief Description of Your Role or Expertise]. Im looking forward to our discussion…

数据库数据恢复—Sql Server数据库文件丢失如何恢复数据?

服务器数据恢复环境&#xff1a; 一台安装windows server操作系统的服务器。一组由8块硬盘组建的RAID5&#xff0c;划分LUN供这台服务器使用。 在windows服务器内装有SqlServer数据库。存储空间LUN划分了两个逻辑分区。 服务器故障&初检&#xff1a; 由于未知原因&#xf…

Android 13 aosp 预置三方应用apk

前提条件 编译启动 launch 选择了 sdk_pc_x86_64-userdebug 该版本 添加一个三方预置应用 Android_source/vendor/third_party/MdmLib/MdmLib.apk 配置三方应用对应的Android.mk Android_source/vendor/third_party/MdmLib/Android.mk LOCAL_PATH : $(call my-dir)include $(CL…

配置香橙派摄像头服务每次开机自动启动

目录 1.创建一个mjpg.sh脚本 2.在脚本中添加以下内容 3.增加可执行权限 4.在/etc/xdg/autostart/下创建mjpg.desktop 文件输入以下内容 1.创建一个mjpg.sh脚本 touch mjpg.sh 2.在脚本中添加以下内容 #!/bin/bash cd /home/orangepi/Myorangepi/zhinenglajitong/mjpg-stre…

数据可视化-ECharts Html项目实战(11)

在之前的文章中&#xff0c;我们学习了如何在ECharts中特殊图表的双y图以及自定义形状词云图。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 数据可视化-ECh…

Linux(Ubuntu) 查看并删除使用【dpkg】安装的软件【mysql 8.3安装失败---原因调查】

目录 ■前言 ■查看安装的软件 ■删除安装的软件 正常删除&#xff08;dpkg -r xxxxName&#xff09; 问题解决&#xff1a;use --purge to remove them too ■其他调查信息 命令 图片1 图片2 图片3 图片4 ■前言 安装Mysql8.3失败 我的服务器-CSDN博客 ■查看安…

绿联HDMI延长器40265使用AG7120芯片放大器方案

HDMI延长器和放大器 延长器&#xff1a;主要用于HDMI线的延长&#xff0c;有HDMI对接头方式延长&#xff0c;或HDMI公头加HDMI母头的HDMI线进行延长&#xff0c;或通过网线方式延长&#xff0c;早期为双网线&#xff0c;目前已发展为单网线&#xff0c;需要注意的是&#xff0…

第四百五十三回

文章目录 1. 问题描述2. 优化方法2.1 缩小范围2.2 替代方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取AppBar的高度"相关的内容&#xff0c;本章回中将介绍关于MediaQuery的优化.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 问题描述 我们在…