[Linux]Linux调试器-gdb

news2024/9/29 7:15:29

🥁作者华丞臧.
📕​​​​专栏:【LINUX】
各位读者老爷如果觉得博主写的不错,请诸位多多支持(点赞+收藏+关注)。如果有错误的地方,欢迎在评论区指出。
推荐一款刷题网站 👉 LeetCode刷题网站


文章目录

  • 前言
  • gdb调试器
    • readelf指令(了解)
  • gdb操作
    • 查看代码
    • 退出gdb
    • 断点
    • 运行程序
    • 查看调用堆栈
    • 执行整个函数
    • 查看变量的值
    • 其它


前言

  • 在vs当中,我们知道可执行程序的发布方式有两种:debug和release模式;
  • Linux gcc/g++出来的二进制程序,默认是release模式;
  • 要使用gdb调试,必须要在源代码生成可执行程序的时候,加上-g选项。

gdb调试器

在Linux中,虽然和windows的调试器思路上是一样,但是其各自的操作方式却大不相同,gdb就是Linux上的调试器。

//安装gdb
sudo yum install -y gdb

//调试程序
gdb [文件名]

在这里插入图片描述
当我们安装好gdb准备调试程序时,gdb会告诉我们无法调试,这是因为默认情况下Linux中用gcc/g++生成程序是release模式,是无法直接被调试的。

为什么有debug和release两种版本?
首先我们要了解什么是debug和release:

  • debug:通常称为 调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不做任何优化,以为开发人员提供 强大的应用程序调试能力。
  • release:通常称为 发布版本,是给用户使用的,一般客户不需要在发布版本上进行调试;所以不保存调试信息,同时,进行了各种优化,以期达到代码最小和速度最优,为用户的使用提供便利。
  • 程序员经常需要进行代码编写以及调试程序,那么就需要以debug版本发布以保证程序是可以被调试的;用户不需要关心软件是否可以debug用户也不需要,用户的需求就是软件怎么用以及好不好用。

debug版本发布选项如下:

  • -g生成以debug模式生成二进制程序

加上-g选项后,我们就能使用gdb开始调试了,并且我们可以发现release版程序要比debug版程序体积小
在这里插入图片描述
在这里插入图片描述

readelf指令(了解)

功能:读取程序内部相关符号表。
其命令格式如下:

readelf -S [文件名] 

//筛选出debug
readelf -S [文件名] | grep debug

可以看到debug版的程序中添加了很多调试信息,而release版的程序当中并没有添加。
在这里插入图片描述

gdb操作

调试代码如下:

//test.c文件中的代码如下:
#include <stdio.h>    
#include <time.h>    
    
void Print(int val)    
{    
    long long timetmp = time(NULL);    
    printf("val = %d, timetmp: %lld\n", val, timetmp);    
}    
    
int GetSum(int begin, int end)    
{    
    int ret = 0;    
    
    for (int i = begin; i <= end; ++i)                                                                                           
    {    
        ret += i;    
    }    
    
    return ret;    
}    
    
int main()    
{    
    int val = GetSum(0, 100);    
    Print(val);    
    return 0;    
} 

查看代码

查看代码:list 简称 l

在这里插入图片描述

从第n行开始显示:l + n 

在这里插入图片描述

l 从上一次的结尾处开始显示,
gdb默认会记住历史上曾经的指令

代码在gdb调试器中的行数如下图:
在这里插入图片描述

退出gdb

退出调试:quit 简称 q

在这里插入图片描述

断点

打断点:break 简称 b   格式:b + n(行号)

在这里插入图片描述

查看断点:info break || info b 

在这里插入图片描述

删除断点:delete 简称 d  格式:d + n(编号)

在这里插入图片描述

禁用断点:disable  n(断点编号)
启用断点:enable n(断点编号)

在这里插入图片描述

断点被禁用时,程序直接运行到结束:
在这里插入图片描述

运行程序

运行程序:run 简称 r

在这里插入图片描述

逐过程调试:next 简称 n

逐过程就是不进入当前行的函数内部,直接把函数跑完。(vs上的F10
在这里插入图片描述

逐语句:step 简称 s

逐语句就是进入当前行的函数内部,逐语句执行。
(vs上的F11)

在这里插入图片描述

逐断点:continue 简称 c

在这里插入图片描述

跳转到指定行:until + n(行号)

注意:使用until跳转时中间不能有断点,否则会停在断点处,并且跳转到空行处会被执行到下一行。
在这里插入图片描述

查看调用堆栈

查看堆栈:bt

在这里插入图片描述

执行整个函数

finish:执行到当前函数返回,然后停下来等待命令

在这里插入图片描述

查看变量的值

查看变量的值:p + 变量名

在这里插入图片描述

常显示变量的值:display

在这里插入图片描述

取消常显示:undisplay + n (n表示编号)

在这里插入图片描述

其它

  • set var:修改变量的值;(格式:set var [变量名]=N)
  • info locals:查看当前栈帧局部变量的值。

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

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

相关文章

HCIA实验(作业)

静态路由综合实验报告 实验目的 建立下图拓扑结构并满足下列要求&#xff1a; 除R5的环回地址固定以外&#xff0c;整个其他所有网段基于192.168.1.0/24进行合理的IP地址划分 R1–R4每个路由器存在两个环回接口&#xff0c;用于模拟连接PC网段&#xff0c;地址也在192.168.1.0…

使用服务网格提升应用和网络安全

当今的企业在正常进行经营的同时&#xff0c;也在不断地与潜在的黑客和不良行为者进行斗争。安全边界逐渐消失&#xff0c;攻击面不断扩大&#xff0c;新的攻击向量不断出现。再加上持续的疫情、全球冲突&#xff0c;难怪每天新闻里都有漏洞、黑客和攻击等内容。 云原生和微服…

低代码平台的七大误解(下)

接上一篇文章“低代码平台的三大误解&#xff08;上&#xff09;”&#xff0c;我们继续看看&#xff0c;人们对于低代码平台还有哪些误解。 误解四&#xff1a;低代码应用程序只能解决我的部分问题 无论您构建什么应用程序&#xff0c;它都必须是可以随着业务增长而扩展的可…

Linux应用编程---2.fork()函数

Linux应用编程—2.fork()函数 ​ fork()函数用来创建子进程&#xff0c;函数具体功能与使用方法一起看编程手册。Linux终端命令下输入&#xff1a;man fork&#xff0c;敲击回车键即可打开fork函数详情页。 2.1 fork()函数详情 图1 fork函数详情首先看SYNOPSIS: 图2 fork函数…

一分钟带你上手JS对象的基本用法

前言 相信大家对 JavaScript 中的对象都不陌生&#xff0c;而且我们几乎每天都在使用它&#xff0c;那你对对象的认识有多少呢&#xff1f;本章就带大家一起出浅入深的了解 JavaScript 中的对象。 一、什么是对象&#xff1f; 到底什么是对象呢&#xff1f;大多数人可能都会脱…

生物信息学——基础篇——一至三代测序技术

生物信息学 生物信息学——基础篇——一至三代测序技术 文章目录生物信息学一、一代测序二、二代测序三、三代测序四、总结一、一代测序 概述&#xff1a;一代测序&#xff08;又称Sanger测序&#xff09;。 原理&#xff1a;Sanger测序利用一类特殊的核昔酸&#xff0c;即dd…

imx6ull内核添加exfat,并自动开机加载

下载地址&#xff1a;https://github.com/dorimanx/exfat-nofuse.git 方式一&#xff0c;移植到内核&#xff0c;通过内核开启 1、下载exfat源码&#xff08;将源码目录设置成exfat方便修改&#xff09;&#xff0c;将其放到内核的fs目录下 2、修改fs目录下的Kconfig文件 3、…

Go语言设计与实现 -- GC的简要介绍

GC实现原理 什么是GC&#xff1f; 垃圾回收也称为GC&#xff08;Garbage Collection&#xff09;&#xff0c;是一种自动内存管理机制 现代高级编程语言管理内存的方式分为两种&#xff1a;自动和手动&#xff0c;像C、C 等编程语言使用手动管理内存的方式&#xff0c;工程师…

OpenHarmony 标准系统 HDF 框架音视频驱动开发

OpenHarmony 标准系统 HDF 框架音视频驱动开发引言OpenHarmony 音频概述HDF 音频驱动框架概述HDF 音频驱动框架分析 —— 音频设备驱动HDF 音频驱动框架分析 —— supportlibs 实现HDF 音频驱动框架分析 —— hdi-passthrough 实现HDF 音频驱动框架分析 —— hdi-binder 实现HD…

从零开始计算机网络——计算机网络课程的了解初步认识计算机网络

目录 &#x1f358;计算机网络学科到底学什么&#xff1f; &#x1f9c7;两个参考模型的介绍 &#x1f96a;OSI参考模型&TPC参考模型&五层参考模型 &#x1f371; 计算机网络学科的重难点——网络协议 &#x1f958;如何学好计算机网络课程&#xff1f; &#x1f363;相…

Java使用BigDecimal(公式精确计算)+(精度丢失问题)

一、Java使用BigDecimal公式计算(精确计算) 介绍: 使用BigDecimal加减乘除方法运算&#xff0c;可以使用BigDecimal类提供的add、subtract、multiply、divide方法函数实现。 公式加法计算~add public static void main(String[] args){BigDecimal a BigDecimal.valueOf(5.6);…

动态规划合集

62 斐波那契数列 public class Solution {public int Fibonacci(int n) { return f(n);}public int f(int n){if(n1||n2){return 1;}return f(n-1)f(n-2);} }这种做法时间复杂度O(2^N),空间复杂度是用递归栈&#xff0c;O(n) 改进&#xff1a;用动态规划&#xff0c;可以…

Pytorch优化器全总结(三)牛顿法、BFGS、L-BFGS 含代码

目录 写在前面 一、牛顿法 1.看图理解牛顿法 2.公式推导-三角函数 3.公式推导-二阶泰勒展开 二、BFGS公式推导 三、L-BFGS 四、算法迭代过程 五、代码实现 1.torch.optim.LBFGS说明 2.使用LBFGS优化模型 优化器系列文章列表 Pytorch优化器全总结&#xff08;一&…

C 程序设计教程(09)—— 数据输出函数(printf)用法详解

C 程序设计教程&#xff08;09&#xff09;—— 数据输出函数&#xff08;printf&#xff09;用法详解 该专栏主要介绍 C 语言的基本语法&#xff0c;作为《程序设计语言》课程的课件与参考资料&#xff0c;用于《程序设计语言》课程的教学&#xff0c;供入门级用户阅读。 目录…

Python小案例

1、简单的打印输出 age =18 print("我的名字是%s,我的国籍是%s"%("小张","中国")) print("我的年纪是:%d岁"%age) print("www","baidu","com",sep=".") #sep是使用.分割的意思,这个输出是百…

微信小程序开发——小程序的宿主环境API,协同工作和发布

一.小程序API概述 小程序中的 API 是由宿主环境提供的&#xff0c;通过这些丰富的小程序 API &#xff0c;开发者可以方便的调用微信提供的能力&#xff0c;例如&#xff1a;获取用户信息、本地存储、支付功能等。 二.小程序API的3大分类 a.事件监听AP1 特点&#xff1a;以…

【服务器数据恢复】服务器硬盘掉线的数据库数据恢复案例

服务器数据恢复环境&故障&#xff1a; 某公司服务器&#xff0c;配备24块FC硬盘&#xff0c;两块硬盘出现故障掉线&#xff0c;导致服务器上层的卷无法挂载。 服务器数据恢复过程&#xff1a; 1、查看服务器硬盘状态发现有两块硬盘离线&#xff0c;将服务器内的所有硬盘做好…

【数据结构-JAVA】栈(Stack)和队列(Queue)

栈1.1 栈的概念栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈 顶&#xff0c;另一端称为栈底。栈中的数据元素遵守先进后出&#xff0c;后进先出的原则&#xff08;LIFO——Last In First Out&a…

【从零开始学习深度学习】41. 算法优化之RMSProp算法【基于AdaGrad算法的改进】介绍及其Pytorch实现

上一篇文章AdaGrad算法中提到&#xff0c;因为调整学习率时分母上的变量st\boldsymbol{s}_tst​一直在累加按元素平方的小批量随机梯度&#xff0c;所以目标函数自变量每个元素的学习率在迭代过程中一直在降低&#xff08;或不变&#xff09;。因此&#xff0c;当学习率在迭代早…

LeetCode 45. 跳跃游戏 II

45. 跳跃游戏 II - 力扣&#xff08;LeetCode&#xff09; 解法1&#xff1a;&#xff08;动态规划 贪心&#xff09; 果然代码越短&#xff0c;思路越难。这题用的是动态规划贪心的思想。首先分析题意我们可以知道&#xff0c;从索引0这个点开始&#xff0c;我们走一步可以…