【Linux调试器】:gdb的使用(常见指令)

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关Linux调试器gdb的使用,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!

C 语 言 专 栏:C语言:从入门到精通

数据结构专栏:数据结构

个  人  主  页 :stackY、

C + + 专 栏   :C++

Linux 专 栏  :Linux

 

目录

引言

1. 背景

2. 开始使用

2.1 查看代码 

2.2 断点 

2.3 调试 

2.4 查看变量 

2.5 跳转 

2.6 调用堆栈 

2.7 其他指令 


引言

每当我们写了一大堆的代码之后,信心满满的去编译运行,但是会发现要不就是出现了BUG,要不就是得到的结果与我们预期的结果不一样,因此需要对代码进行调试,逐语句、逐过程的来分析代码的问题,在之前使用的VScode中可以使用F10/ctrl + F10进行调试,那么在Linux中如何对代码进行调试呢?话不多说,直接开始!

1. 背景

如果一份代码要被调试,这份代码发布模式必须是Debug模式的。

在学习Linux调试工具之前我们先来了解一些Linux程序的一些特性:

  • 程序的发布方式有两种,debug模式和release模式
  • Linux gcc/g++出来的二进制程序,默认是release模式

        如何证明呢?当我们直接使用gdb来调试一个程序的时候,会生成报错信息:

        

  • 要使用gdb调试,必须更改为debug模式,在源代码生成二进制程序的时候, 加上 -g 选项

  • 在debug发布的时候,一定要给可执行程序内部添加debug信息,否则程序无法调试;那么既然加了一些调试信息,我们就可以认为debug形成的可执行程序是大于release行程的可执行程序的:
  • 我们在Linux中形成的可执行程序的格式都是ELF格式的。
  • 在Linux中使用readelf -S 可执行程序,可以查看该可执行程序的二进制构成,那么就可以使用它搭配上grep来过滤一下可执行程序中的debug信息:

2. 开始使用

开始调试:gdb + 可执行程序

注意:后面跟的是可执行程序,并不是源文件!!!

 退出gdb:q/quit

​​​​​​​​​​​​​​

gdb可以记录上一个命令,直接Enter就是上一个命令  

2.1 查看代码 

查看代码:l/list

可以发现显示出来的代码不完整,如果需要查看全部的代码呢?

查看全部代码:l 0 -> Enter(先输入l 0,然后再一直按Enter,直到把全部的代码显示完毕)

直接运行代码:r/run

2.2 断点 

打断点:b + 行号

给指定源文件中打断点:b  源文件:行号

给函数打断点:b + 函数名(默认打在了函数入口处)

查看断点:info b 

删除断点:d + 断点编号

在打完断点之后,再使用r,就可以直接跳转到断点处:

在一个gdb的调试周期中,断点的编号是一直递增的;

在使用quit退出gdb后,再次进行gdb上一次的所有断点都不存在了。

禁用断点:disable + 断点编号(不删除)

启用断点:enable + 断点编号

2.3 调试 

逐过程(类似于VScode中的F10):n/next

逐语句(类似于VScode中的F11):s/step 

2.4 查看变量 

查看变量值:p + 变量

 

监视变量(常显示):display + 变量

取消监视(取消常显示):undisplay + 常显示条目编号

2.5 跳转 

直接跳转语句至指定位置:until + 行号

运行到当前函数的结尾:finish

从一个断点直接运行到下一个断点:c/continue

2.6 调用堆栈 

查看调用堆栈:bt

2.7 其他指令 

 显示所有的局部变量:info locals

修改变量的值:set var 变量 = xxx

 

 

朋友们、伙计们,美好的时光总是短暂的,我们本期的的分享就到此结束,欲知后事如何,请听下回分解~,最后看完别忘了留下你们弥足珍贵的三连喔,感谢大家的支持!   

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

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

相关文章

消除模型盲区,让透明件身后模型无所遁形

使用SOLIDWORKS设计产品出工程图,当模型中存在透明零部件时,由于位置摆放可能会遮挡其他零件。 这会影响零件在工程图中展示装配关系。 通常我们会采用剖视图或改变视图方向来展示被遮挡的零件。 SOLIDWORKS 2023版本发布了工程图中透视透明的零部件功能…

BUG:conda: command not found解决方法

文章目录 报错信息解决方法 报错信息 conda: command not found解决方法 直接输入 source ~/.bashrc看看这时输入conda有没有显示。如果没有的话,输入 vim ~/.bashrc 输入i进入编辑模式。之后 export PATH$PATH:[你自己conda的安装目录]输入vim的保存命令: ES…

分布式锁讲解

概括 分布式锁是一种用于在分布式系统中实现同步机制的锁。在单机系统中,我们可以使用如Java中的synchronized关键字或者 ReentrantLock来实现线程间的同步,但在分布式系统中,由于多个节点(服务器)之间的并发操作&am…

hbase建表预分区的2种方法

以下案例建表并设置预分区,分别测试以下2种方法 1.固定散列 示例:rowkey以日期为前缀 create ‘test’,‘cf1’, SPLITS > [‘202401’, ‘202402’, ‘202403’] put ‘test’,‘20240101’,‘cf1:name’,‘20240101’ put ‘test’,‘20240102’,‘cf1:name’,‘2024010…

Meta-SR: A Magnification-Arbitrary Network for Super-Resolution

CVPR2019https://github.com/XuecaiHu/Meta-SR-Pytorch 问题引入 首个解决任意尺度超分问题的模型,借鉴了meta-learning的思想;weight prediction strategy(meta-learning):神经网络的权重是由另一个神经网络预测的,而不是通过从…

计算机中GPU快不行的几个标志,看下有没有你遇到的

GPU是处理图形密集型任务的主要组件。尽管它非常耐用,但它最终会磨损并开始失效。在到达生命的终结之前,它通常会显示出即将发生故障的迹象,需要及时修复或更换。本指南详细介绍了这些标志。 在我们开始之前 在深入研究GPU故障的迹象之前,重要的是要承认,下面提到的一些…

Cad图纸加密软件哪个最好用?成都企业都在用的透明加密软件是什么?

企业数据泄露事情频繁发生,为企业带来了不可计算机的经济损失,以及巨大的经营风险。在DT时代的到来,每一家企业的市场竞争本质上是知识产权的竞争,对于制造类企业来讲知识产权无疑是企业的cad图纸,制造类企业cad图纸的…

Java中常用类String的不可变性详解

Java中常用类String的不可变性详解 在Java编程中,String类是一个非常重要的基础类,它用于表示和操作字符串序列。然而,String类的一个核心特性是其不可变性(immutable)。这个特性在Java编程中有着重要的影响&#xff…

PXE批量部署,一键安装配置多台Linux系统

目录 一、PXE批量部署的优点 二、搭建PXE远程安装服务器 1. 实验初始化设置 2. 一键安装软件包 3. 复制 vmlinuz、initrd.img、pxelinux.0文件 4. 配置PE启动菜单配置文件 5. 修改配置文件, 启动各个软件服务 6. kickstart自动应答文件修改启动菜单配置文件…

【磁盘】用 gdisk 新增分区、删除分区

相关文章: 【Linux学习笔记16】磁盘的分区、格式化、检验与挂载(blkid、lsblk、UUID、parted查看分区的格式、lvm命令) 1. 用 gdisk 新增分区 如果你是按照鸟哥建议的方式去安装你的 CentOS 7,那么你的磁盘应该会预留一块容量来做练习的。如果没有的话…

什么是静态住宅代理IP?

静态住宅代理(也称为静态ISP代理)是最流行的代理类型之一。它们也是隐藏您的身份并保持在线匿名的最佳方法之一。您为什么要使用住宅代理而不是仅使用常规代理服务?下面我具体分享。 一、什么是静态住宅代理? 首先,我…

【iOS】事件传递与响应机制

文章目录 前言事件UIEvent一、事件传递遍历顺序 二、手势识别三、响应机制UIResponder(响应者)响应者链 四、相关应用扩大button点击范围穿透事件 总结 前言 提到响应者链与事件传递,如果看过其他人的博客,经常能看到这经典的三张…

苍穹外卖Day06笔记

疯玩了一个月,效率好低,今天开始捡起来苍穹外卖~ 1. 为什么不需要单独引入HttpClient的dependency? 因为我们在sky-common的pom.xml中已经引入了aliyun-sdk-oss的依赖,而这个依赖低层就引入了httpclinet的依赖,根据依…

Docker部署Metabase

文章目录 Docker安装MetabaseCentOS7安装Docker获取最新的 Docker 镜像启动Metabase容器在Metabase初始化时查看日志访问Metabase Metabase 的 ClickHouse 驱动程序安装环境简介删除容器创建容器下载click house驱动放入驱动重启容器将元数据库连接到 ClickHouse报错解决 Docke…

【华为OD机试C卷D卷】部门人力分配(C++/Java/Python)

【华为OD机试】-(A卷+B卷+C卷+D卷)-2024真题合集目录 【华为OD机试】-(C卷+D卷)-2024最新真题目录 题目描述 部门在进行需求开发时需要进行人力安排。 当前部门需要完成 N 个需求,需求用 requirements 表述,requirements[i] 表示第 i 个需求的工作量大小,单位:人月。 这部…

代码随想录算法训练营第36期DAY23

DAY23 530二叉搜索树的最小绝对差 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(null…

YOLOv9改进策略 | 添加注意力篇 | 一文带你改进GAM、CBAM、CA、ECA等通道注意力机制和多头注意力机制

一、本文介绍 这篇文章给大家带来的改进机制是一个汇总篇,包含一些简单的注意力机制,本来一直不想发这些内容的(网上教程太多了,发出来增加文章数量也没什么意义),但是群内的读者很多都问我这些机制所以单…

2. SVG的使用方式

可缩放矢量图形(SVG)是一种基于XML的图像格式,用于网络上的二维图形。SVG允许图形在不同尺寸下保持高质量,这使得它非常适合响应式设计。本文将介绍SVG的几种使用方式,包括实例代码、应用场景以及各自的优缺点。 1 内…

C++(函数高级)

函数默认参数 在C中&#xff0c;函数的形参列表中&#xff0c;形参是可以有默认值的 语法&#xff1a;返回值类型 函数名 &#xff08;参数 默认值&#xff09;{} #include<iostream> using namespace std;//函数默认参数 //如果我们传入自己的数据&#xff0c;就使用自…

PDPS15---安装过程---常遇问题---分享

目录 问题1 安装失败 1.1 运行第一步出错 1.2 解决 问题2 路径错误 2.1 错误 2.2 解决 问题3 运行失败 3.1 无法找到路径 3.2 原因分析 3.3 解决 问题4 拒绝访问 4.1 出现提示 4.2 分析 4.3 解决 问题5 许可证过期 5.1 PD找不到许可证 5.2 解决 问题1 安装失败…