Linux调试器-gdb介绍

news2025/1/13 17:01:23

image-20221217215247988

文章目录

  • gdb的基础使用
    • gdb是什么
    • gdb的使用
      • gdb的下载
        • **l 显示代码**
        • **b 行号 :打断点**
        • **info b :查看断点**
        • **d 断点序号 :删除断点**
        • **r :运行调试**
        • **n(next) :逐过程**
        • **s(step):逐语句**
        • **c(continue):从这个断点到下一个断点停下**
        • **bt:查看函数栈帧**
        • **finish 执行到当前函数返回,然后听下来等待命令**
        • **p 临时变量名**
        • **display 临时变量名:常显示临时变量 undisplay 序号 :取消常显示 序号对应的临时变量**
        • **until 行号 :跳到某行**
        • **set var 临时变量名:修改临时变量**
        • **info locals :查看当前栈帧局部变量的值**
        • **enable breakpoints:启用断点 disable breakpoints:禁用断点**

gdb的基础使用

gdb是什么

GDB是 GNU开源组织发布的一个强大的Unix/Linux下的,基于命令行的程序调试工具。

以下gdb的使用是基于像知道在vs上调试思路和方法基础上讲解的(本人是用的vs stdio2019)

gdb的使用

gdb的下载

指令:sudo yum -y install gdb

输入后需要输入当前用户的密码

image-20221217151040522

在gdb模式下输入

q(或者ctrl+d)退出gdb调试模式
l(list)显示binFile源代码,一次显示10行按enter接着显示
l 0从第0行开始显示,按enter接着显示
b(breakpoint) 行号在目标行打断点-形成序号
info b查看断点-显示序号
d 断点序号删除序号的断点-删除序号
r(run)从开始连续而非单步执行程序-简称运行调试->等同于vs 里面的F5(开始调试)
n(next)逐过程
s(step)逐语句
c(continue)从当前位置开始连续而非单步执行程序即是到下一个断点停下
bt(breaktrace)查看各级函数调用及参数
finish执行到当前函数返回,然后停下来等待命令
p 变量打印变量值
disable 变量名常显示变量
undisable 序号取消常显示序号对应的变量
until 行号跳到对应行
set var 变量名修改变量的值
info locals查看当前栈帧局部变量的值
enable breakpoints 序号启用序号对应的断点
disable breakpoints 序号禁用序号对应的断点(断点只有标记的用处)

然后我们创建一个test.c和一个Makefile,前者写一个从0加到100的函数并打印,后者编译test.c生成可执行程序test

image-20221217152709202

并且能够执行(timestamp-时间戳)

image-20221217152932045

然后我们调试test 输入gdb 文件名称 进入gdb调试模式

image-20221217153522830

并且我们还发现下面写着没有找到bug标记,并且调试不了!为啥?(输入q退出gdb模式)

在Linux中,用gcc或g++生产程序是默认是release版本,并且是动态链接库,而gdb无法对release版本进行调试,gdb对debug版本才能进行调试。那么我们需要把release版本换成debug版本。

我们只需在编译时在程序后加-g即可。这里我为了更可观的看到调试在可执行程序后面加了_g后缀。

我们进入Makefile文件修改

image-20221217155559551

我们可以看到debug版本比release版本大小要大

release版本面向用户,那么只需要最优化的版本。而debug版本面向程序员,需要有调试等等操作的文件在里面。

image-20221217155727694

我们通过readelf -S 文件名 查看可执行程序条带化对应的可执行程序细节信息

我们通过 readelf -S test_g(debug版本) 和readelf -S test(release版本)查看二者可发现debug版本下就多了图中这些调试信息

image-20221217161210892

这样可以更直观的看到二者区别

image-20221217161602842

l 显示代码

image-20221217162304532

我们接着按enter就会接着显示直到显示完全

image-20221217162551622

b 行号 :打断点

我们在第11行,13行,15行打断点

info b :查看断点

d 断点序号 :删除断点

我们删除 第1个断点 第2个断点

image-20221217163515275

r :运行调试

我们运行调试到断点1-代码的第19行停下

image-20221217184752797

n(next) :逐过程

现在我们不进入Addsum函数并想把这个函数跑完到下一个行,那么我们可以输入n(next)

image-20221217185522625

s(step):逐语句

现在我们进入Print函数那么可以输入s

image-20221217185756320

现在我们输入info b查看断点,可以看到断点1已经被命中一次

image-20221217190325100

现在我给test.c加一些代码

image-20221217192830543

c(continue):从这个断点到下一个断点停下

现在我在第19、23、26、27行打断点,run到19行后,我不想进入Add函数想跑到下一个断点,可以输入c到23行

image-20221217193028020

bt:查看函数栈帧

相同的我先run到第19行,进入Addsum函数,输入bt可以看到函数栈帧

image-20221217204812552

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

如上图我进入Add函数后,输入finish把函数跑完并停下来,再输入n才到第20行

p 临时变量名

现在我run到19行进到Addsum函数体内,输入p i查看临时变量i ,查看 i地址输入p &i

image-20221217210822101

display 临时变量名:常显示临时变量 undisplay 序号 :取消常显示 序号对应的临时变量

常显示 变量i,变量i的地址,变量sum,取消常显示 序号1(i)

image-20221217211609798

until 行号 :跳到某行

image-20221217212004973

set var 临时变量名:修改临时变量

同样的我们r到19行进入函数Addsum函数,原本变量i=0,set var i=99后,临时变量变为99了,同样函数最后的结果也会改变!

image-20221217212640370

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

进入Addsum函数体内,info locals查看到查看当前栈帧局部变量的值为sum=0

image-20221217213001184

enable breakpoints:启用断点 disable breakpoints:禁用断点

我们再一次调试它,取了三个断点,查看后都是启用的,输入disable breakpoints 1->禁用断点1,再enable breakpoints 1启用断点1

**image-20221217213712958
ok对于Linux调试器gdb的介绍就到这了,介绍了基础实用的指令,要多多练习才能熟记于心噢~

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

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

相关文章

程序员接私活的那些事

每日坚持一点点,就离目标近一点。 文章目录怎么在空闲时间获得格外的收入接私活的有哪些途径接私活的途中需要注意什么格外福利怎么在空闲时间获得格外的收入 今天我们就不聊技术问题,咱们聊聊一个有意思的话题—>怎么在空闲的时间获得格外的收益&…

设计模式3 - 结构型模式

23种设计模式分析与见解开篇、UML、软件设计原则https://blog.csdn.net/lili40342/article/details/128358435创建型模式https://blog.csdn.net/lili40342/article/details/128358392结构型模式https://blog.csdn.net/lili40342/article/details/128358313行为型模式https://bl…

UNIAPP实战项目笔记54 登录时用state存储用户信息并持久化用户登录和退出登录功能

UNIAPP实战项目笔记54 登录时用state存储用户信息并持久化用户登录和退出登录功能 登录信息各个页面同步使用的是state 登录信息的持久化使用的是本地存储 打开APP自动初始化本地存储数据到state中 实际案例图片 登录页面数据渲染 代码 login.vue页面 登录成功后显示的页面 &l…

论文阅读 - Social Bot-Aware Graph Neural Network for Early Rumor Detection - CCF B

目录 摘要: 1 绪论 2 问题定义 3 SBAG模型 3.1社交机器人检测 3.2 机器人感知图神经网络 3.2.1基于GCN的用户发布 3.2.2 基于GAT的用户交互 3.2.3文本编码器 3.2.4 输出层 3.3 训练 4 实验 4.1 数据集 4.2 实验设置 4.3 基线 4.4 实验结果 4.4.1 谣言…

对时间序列数据(牛仔裤销售数据集)进行LSTM预测(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 LSTM模型的一个常见用途是对长时间序列数据进行学习预测,例如得到了某商品前一年的日销量数据,我们可以…

【GPU】Nvidia CUDA 编程高级教程——利用蒙特卡罗法求解近似值(NVSHMEM)

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…

MyBatis + SQL Server Using Table-Valued Parameters

一、实现原理 参考文档 Using table-valued parametersSystem requirements for the JDBC driverMicrosoft JDBC Driver for SQL Server1、微软官方封装了 JDBC 驱动 jar 包,提供 SQLServerDataTable 类; 2、Mybatis 官方提供自定义类型处理接口 TypeHa…

Python学习笔记-Pygame

目录 一、Pygame概述 1.安装Pyganme 2.Pygame常用模块介绍 2.1 display模块常用方法 2.2 pygame.event模块常用方法 2.3 Surface对象的常用方法 记述关于Pyganme开发的基本知识。 一、Pygame概述 Pygame是跨平台的python模块,转为电子游戏设计(包…

Vue打包后的不同版本解析

vue源码打包版本 这里选取我们开发中常见的几个版本进行说明。 1、vue(.runtime).global(.prod).js 在html页面中通过 <script src“...”> 标签直接使用。通过CDN引入和npm下载的Vue就是这个版本。会暴露一个全局的Vue来使用。&#xff08;.runtime&#xff09;和&…

2022年12月python的字符串常用操作

字符串在整整个开发的过程中&#xff0c;使用频率相对来说是较高的。 在此总结几个字符串的常用操作&#xff0c; 字符串的操作&#xff0c;转换后即生成为新字符串 【长度统计 切片&#xff1a; 【 根据索引进行切片str[开始索引:结束索引:步长] 根据指定标识符进行切片str.sp…

【码极客精讲】桶排序

桶排序 (Bucket sort)或所谓的箱排序&#xff0c;是一个排序算法&#xff0c;工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序&#xff08;有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序&#xff09;。桶排序是鸽巢排序的一种归纳结果。当要被排…

【硬币识别】形态学硬币计数【含Matlab源码 683期】

⛄一、硬币图像识别简介 本设计为硬币图像识别统计装置&#xff0c;通过数码相机获取平铺无重叠堆积的硬币的图像&#xff0c;并通过Matlab工具处理后统计硬币的数目。 1 图像格式转换 取的图像格式为RGB彩色图像&#xff0c;需要先将其转换为8位256级的灰度图像。本程序采用…

SAP Gateway 里的 REST 概念

SAP Gateway 有助于轻松配置和使用 SAP Business Suite 系统的业务逻辑和内容&#xff0c;用于移动和 Web 应用程序。它降低了访问 SAP 数据所需的复杂性和技能组合&#xff0c;从而消除了部署障碍。使用简单的界面有助于缩短开发时间。 SAP Gateway 使以人为本的应用程序能够…

【笔记:模拟CMOS集成电路】MOS特性仿真分析

【笔记&#xff1a;模拟CMOS集成电路】MOS特性仿真分析前言一、电路图二、电路仿真&#xff08;1&#xff09;Ids与Vds的关系仿真仿真结果仿真结果分析&#xff08;2&#xff09;Ids与Vgs的关系仿真仿真结果仿真结果分析前言 本文为本人学习模拟集成电路相关知识的的学习笔记&a…

USB接口WIFI(MT7601芯片)的驱动源码移植过程详解(驱动源码编译、wpa_supplicant工具交叉编译、文件系统移植)

1、MT7601的移植步骤 (1)确认你的WT7601网卡硬件是正常的&#xff1b; (2)修改驱动源码&#xff0c;依赖内核源码树编译并加载&#xff1b; (3)交叉编译wpa_supplicant工具&#xff0c;移植到根文件系统里&#xff1b; (4)添加驱动和wpa_supplicant工具依赖的配置文件&#xff…

2022 年时间序列分析最顶流的 Python 库

时间序列分析是一种强大的工具&#xff0c;可用于从数据中提取有价值的信息并对未来事件进行预测。它可用于识别趋势、季节性模式和变量之间的其他关系。时间序列分析还可用于预测未来事件&#xff0c;例如销售、需求或价格变动。 如果你在 Python 中处理时间序列数据&#xf…

数据库实验三:完整性语言实验

实验三 完整性语言实验 实验 3.1 实体完整性实验 1.实验目的 ​ 掌握实体完整性的定义和维护方法。 2.实验内容和要求 ​ 定义实体完整性&#xff0c;删除实体完整性。能够写出两种方式定义实体完整性的SQL语句&#xff1b;创建表时定义实体完整性、创建表后定义实体完整性…

C++ Reference: Standard C++ Library reference: Containers: map: map: key_comp

C官网参考链接&#xff1a;https://cplusplus.com/reference/map/map/key_comp/ 公有成员函数 <map> std::map::key_comp key_compare key_comp() const;返回键比较对象 返回容器用于比较键的比较对象的副本。map对象的比较对象在构造&#xff08;construction&#xff…

kubernetes 挂载传播

kubernetes 挂载传播 kubernetes 的 mountPropagation 翻译成中文就是挂载传播。挂载传播提供了共享卷挂载的能力, 它允许在同一个 Pod, 甚至同一个节点内, 在多个容器之间共享卷的挂载。 说白了就是在容器或 host 内的挂载目录中 再 mount 了一个别的挂载。 kubernetes 中 卷…

第18章 条件概率

第18章 条件概率 18.1蒙特霍尔困惑 对于上一章的三个门的问题&#xff0c;有一个漏洞。假设参赛者选择门A且门B后有一只山羊&#xff0c;刚好产生3个结果&#xff1a; 以上结果出现的概率分别是1/18,1/18,1/9。 在这些结果中&#xff0c;只有最后一个结果(C,A,B)&#xff0c…