基础gdb操作【Linux】

news2024/11/18 9:32:34

基础gdb操作【Linux】

  • 一.gdb
    • 1.1 什么是gdb
    • 1.2 安装gdb
    • 1.3 如何进入gdb模式
      • 1.3.1 release/debug
      • 1.3.2 进入debug
      • 1.3.3 进入gdb调试模式
  • 二.基础操作
    • 2.0 list 行号和 r
      • 2.0.1 list 行号
      • 2.0.1 r/run
    • 2.1 断点操作
      • 2.1.0 打断点
      • 2.1.1 查看断点信息
      • 2.1.2 删除断点
      • 2.1.2 断点开关闭
    • 2.2 程序执行操作
      • 2.2.1 n 逐过程
      • 2.2.2 s 逐语句
      • 2.2.3 finish:直接跑完函数
      • 2.2.4 c:从一个断点处运行到下一个断点
    • 2.3 其他指令
      • 2.3.1 display 变量名:展示变量
      • 2.3.3 info locals:本地变量
      • 2.3.4 bt:查看从开始到现在的调用堆栈
      • 2.3.5 ctrl+d/q退出gdb

一.gdb

1.1 什么是gdb

想必大家应该都在Linux中写过代码,没写过的应该也不会点进这篇博客了。
(毕竟没写过也用不上gdb)
gdb是linux中的一种调试工具,可以帮我们进行断点,逐语句,逐过程的调试。
让我们在Linux中也能体会到在WIN中码代码的感觉。

1.2 安装gdb

了解了gdb后,那想要使用gdb第一件事肯定是安装gdb了。
先进行检查是否系统是否自带gdb

gdb --version

在这里插入图片描述
如果显示了版本号就代表自带gdb了。

但是如果没有的话也没事

sudo yum install gdb

直接安装即可
在这里插入图片描述

我因为自带所以就不用安装了。

1.3 如何进入gdb模式

1.3.1 release/debug

现在既然装好了gdb,那就是如何使用了。

还记得我们之前码代码的时候,代码有两种模式:
debug/release
release是发行版本
debug是调试版本
我们想用gdb对代码进行调试,那首先的要求就是代码可以被进行调试
所以我们要将代码设置成debug模式。

  • 但是Linux中代码默认模式是release版本

1.3.2 进入debug

所以这个时候就要在编译代码的时候将其设置为debug模式

gcc test.c -o test -g

这里的-g就代表以debug模式编译代码。
在这里插入图片描述

这里发现-g加不加没有啥变化,但是如果用

readelf -S 文件名 | grep -i debug

来查看调试信息
在这里插入图片描述

就会发现多出了很多debug的文件

我们来看看不加-g的结果是怎么样的
在这里插入图片描述
这里会发现grep没有在test中查找出具有debug的文件。

1.3.3 进入gdb调试模式

这里在确保自己的可执行文件是debug版本
就可以进入gdb的调试模式了

gdb 文件名

即可在这里插入图片描述

二.基础操作

这里为了方便进行操作,所以在test.c中特地写了一段简单的循环
在这里插入图片描述

2.0 list 行号和 r

2.0.1 list 行号

在这里插入图片描述
进入gdb后第一个疑问就是没有代码。
调试肯定是要看到源代码的啊
所以我们便来了第一个指令
list/l 行号
在这里插入图片描述
l后跟了一个1,代表显示从第一行开始的十行
但是这里我们发现程序没有显示完全。

但是我们只要再按一次回车即可
因为gdb记住了上个指令,l 1执行完以后显示到10行,所以接下来直接按回车,
linux程序会自动执行l 11的指令
.

在这里插入图片描述
所以这里只需要按一次回车即可

在这里插入图片描述
不带 数字的l,第一次默认从零开始
但是如果不是第一次,那就默认从上次记忆的l位置处执行

所以:想要最快显示全部代码,打个l,不停按回车即可

2.0.1 r/run

r算是即显示代码之后最基础的指令了

r是run的缩写,所以毫无疑问就是执行代码的意思

2.1 断点操作

b/break
b是break的缩写。

2.1.0 打断点

b 行号

很明显,代表的意思是在行号上打个断点

b 函数名称

代表的在函数上打断点

b test.c:行数/函数名称   
  文件名   文件名中的行数或者函数名称

这个可以在另一个文件上进行添加断点的操作。
在这里插入图片描述

2.1.1 查看断点信息

这里打了断点后,我们发现这边代码上并没有进行标注哪里有断点。
在这里插入图片描述
所以想要查看断电信息


info b

在这里插入图片描述
这里我们能看到打的断点信息

num是断点序号
type就是类型
enb就是断点是否开启
address就是断点地址
what就是断点位于程序的位置

2.1.2 删除断点

这里我们通过上面的info b,能发现多了一个相同行号的断点

我们可以通过

d 断点序号

来进行删除,断点序号就是info b中的num属性
在这里插入图片描述
这里就能看见完成了对断点的删除

2.1.2 断点开关闭

disable 断点序号 设置断点关闭
enable 断点序号 设置断点开启

断点开关闭,就是控制断点是否有效。
就是info b中的enb属性

在这里插入图片描述
这里我们关闭了断点,可以发现2号断点enb变成了no

2.2 程序执行操作

打了断点以后我们就可以进行程序的运行测试了。

我们打了断点后,不能直接用以下指令
我们首先需要用r将代码跑起来,才能使用下列指令

2.2.1 n 逐过程

2.2.2 s 逐语句

在这里插入图片描述
这里能发现程序左边的数字,代表的是程序运行到了哪一行,并且会显示当前运行的代码

2.2.3 finish:直接跑完函数

2.2.4 c:从一个断点处运行到下一个断点

这里就不进行演示了,因为效果大差不差。

2.3 其他指令

我们能打断点了,能进行一步一步运行代码了。
现在差的就是显示当前行的变量值了。

2.3.1 display 变量名:展示变量

在这里插入图片描述
这里我们能用display让程序恒显示对应的变量
在这里插入图片描述

2.3.3 info locals:本地变量

在这里插入图片描述
这个指令可以用来显示当前本文件中的所有本地变量的当前值

2.3.4 bt:查看从开始到现在的调用堆栈

在这里插入图片描述
bt是用来显示调用堆栈的,在递归中有明显的表现。
在这里插入图片描述
这里随便写了个递归来测试。
在这里插入图片描述
这里还是十分明显的

2.3.5 ctrl+d/q退出gdb

用当前快捷键可以直接推出gdb模式。

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

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

相关文章

Kibana开发工具安装

版本说明 名称版本备注kibana kibana-7.7.1-linux-x86_64.tar.gz 安装配置 tar -zxvf kibana-7.7.1-linux-x86_64.tar.gz -C /usr/local/ cd /usr/local/ mv kibana-7.7.1-linux-x86_64/ kibana-7.7.1/ #编辑配置文件,在末尾添加 vim /usr/local/kibana-7.7.1/con…

深入理解环境变量

前言 指令就是可执行程序,当我们运行自己的可执行程序时,需要用./来指定路径,可是为什么运行指令时不用指定路径呢?这就是环境变量的作用。 一.常见环境变量 环境变量是在程序运行期间需要用到的具有特定功能的一组变量&#x…

来看看如何使用CLOUDFARE_实现网络聚合_利用安全的网络协议实现网络通讯---工具箱工作笔记002

下面这个操作是需要进行安全网络下操作的 首先需要去访问https://1.1.1.1这样一个网站然后去下载对应的软件,安装上 首先进入这个网址 www.cloudflare.com 去点击注册 注册以后 然后登录,登录以后,然后左侧有个zero trust 然后再去写一个名字,团队的名字 然后选择也是免…

win11快速打开蓝牙设置的方法

win11快速打开蓝牙设置的方法 Windows 11 中快速连接蓝牙设备的 3 种方法!_哔哩哔哩_bilibili 如何为Windows设置快捷键?_百度知道 (baidu.com) Win11怎么隐藏文件夹?Win11通过命令隐藏文件夹的方法_windows11_Windows系列_操作系统_脚本之家 (jb51.net…

2020年江西省职业院校技能大赛软件测试技能竞赛方案(高职组)

2020年江西省职业院校技能大赛 软件测试技能竞赛方案(高职组) 各高等职业院校: 根据江西省教育厅《关于举办2020年江西省职业院校技能大赛的通知》(赣教职成字〔2020〕19号)文件精神,现举办2020年江西省职业…

【软考】11.1 生命周期/CMM/开发模型

《信息系统生命周期》 软件工程的基本要素:方法、工具、过程 五阶段生命周期的定义和输出 规划 ——> 分析 ——> 设计 ——> 实施 ——> 运行和维护系统分析阶段:逻辑设计 ——> 逻辑模型系统设计阶段:物理设计 ——> 物…

常用的设计模式以及操作Redis、MySQL数据库、各种MQ、数据类型转换的方法

文章目录 🌟 如何优雅地写出高质量的Java代码🍊 设计模式🎉 单例模式🎉 工厂模式🎉 观察者模式 🍊 操作Redis🎉 连接Redis🎉 存储数据🎉 获取数据🎉 删除数据…

SpringBoot环境搭建与初创程序

一:IDEA环境准备 IDEA社区版版本: 2021.1-2022.1.4 IDEA专业版版本: 无要求 🌟如果个人电脑安装的IEDA不在这个范围,需要卸载重新安装;且⼀定要删除注册表 参考文章➜IDEA卸载和删除注册表 二: Maven (1)Maven的概念…

Java练习题-输出斐波那契(Fibonacci)数列

✅作者简介:CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1🏆 📃个人主页:hacker707的csdn博客 🔥系列专栏:Java练习题 💬个人格言:不断的翻越一座又…

CSS3属性详解(一)文本 盒模型中的 box-ssize 属性 处理兼容性问题:私有前缀 边框 背景属性 渐变 前端开发入门笔记(七)

CSS3是用于为HTML文档添加样式和布局的最新版本的层叠样式表(Cascading Style Sheets)。下面是一些常用的CSS3属性及其详细解释: border-radius:设置元素的边框圆角的半径。可以使用四个值设置四个不同的圆角半径,也可…

自动化测试08

Junit 为什么学了Selenium还需学习Junit Selenium自动化测试框架;Junit单元测试框架。 拿着一个技术写自动化测试用例(Selenium3) 拿着一个技术管理已经编写好的测试用例(Junit5) Junit相关的技术 Junit是针对Java的一…

Cesium Vue(五)— 绘制多边形

1. 使用entity创建矩形 var rectangle viewer.entities.add({rectangle: {coordinates: Cesium.Rectangle.fromDegrees(// 西边的经度90,// 南边维度20,// 东边经度110,// 北边维度30),material: Cesium.Color.GREEN.withAlpha(0.8),},2. 使用primivite创建矩形 // primivite创…

【公众号开发】Access Token的获取 · 请求公众号服务器创建自定义菜单 · 处理自定义菜单按钮事件

【公众号开发】(3) 文章目录 【公众号开发】(3)1. 获取Access token1.1 确定参数1.2 补全URL(添加query string)1.3 测试 2. 封装AccessToken以便保存与后期使用2.1 TokenUtils做出一些调整2.2 单例模式的A…

YOLOv5改进实战 | 更换主干网络Backbone(三)之轻量化模型Shufflenetv2

前言 轻量化网络设计是一种针对移动设备等资源受限环境的深度学习模型设计方法。下面是一些常见的轻量化网络设计方法: 网络剪枝:移除神经网络中冗余的连接和参数,以达到模型压缩和加速的目的。分组卷积:将卷积操作分解为若干个较小的卷积操作,并将它们分别作用于输入的不…

【手把手教你】使用Python玩转多元时间序列分析

在探索和理解复杂的金融市场行为时,时间序列分析成为了一种无法忽视的强有力工具。特别是,当我们处理的不仅是单一的时间序列,而是多个时间序列并存,并且它们之间存在一种或多种形式的互动时,多元时间序列分析的重要性…

线性代数3:矢量方程

一、前言 欢迎回到系列文章的第三篇文章,内容是线性代数的基础知识,线性代数是机器学习背后的基础数学。在我之前的文章中,我介绍了梯队矩阵形式。本文将介绍向量、跨度和线性组合,并将这些新想法与我们已经学到的内容联系起来。本…

如何使用内网穿透技术实现USB设备(USB Redirector)共享

文章目录 前言1. 安装下载软件1.1 内网安装使用USB Redirector1.2 下载安装cpolar内网穿透 2. 完成USB Redirector服务端和客户端映射连接3. 设置固定的公网地址 前言 USB Redirector是一款方便易用的USB设备共享服务应用程序,它提供了共享和访问本地或互联网上的U…

驱动开发 CoetexA7核 字符设备驱动(LED亮灯)(单独映射寄存器实现+封装结构体映射实现)

一、单独映射寄存器实现 可参考arm点灯C语言 cortex-A7核 点LED灯 &#xff08;附 汇编实现、使用C语言 循环实现、使用C语言 封装函数实现【重要、常用】&#xff09;-CSDN博客 1 应用程序 test.c #include <stdio.h> #include <sys/types.h> #include <sys/s…

我的电子萝卜刀火了吗?

引言 大家好&#xff0c;我是亿元程序员&#xff0c;一位有着8年游戏行业经验的主程。 笔者在上一篇文章《萝卜刀真的太危险了,于是我用Cocos做了一个》中说到因女儿从学校回来之后想要我给她买一把萝卜刀被我拒绝&#xff0c;但是又想要让她体验一下&#xff0c;因此用Cocos…

【广州华锐互动】建筑安全事故VR沉浸式体验系统

在建筑行业中&#xff0c;安全永远是首要的考虑因素。传统的安全培训方法&#xff0c;如书本教学、现场演示等&#xff0c;虽然能在一定程度上提高员工的安全意识&#xff0c;但这些方法往往缺乏实际体验&#xff0c;员工在真正面临危险时可能无法做出正确的判断和反应。近年来…