Linux | gdb的基本使用

news2024/11/16 1:51:20

目录

前言

一、调试文件的生成

二、调试指令

1、选择调试文件

2、查看代码

3、运行代码

4、断点

5、打印与常显示

6、其他

总结


前言

        前面我们学习了如何使用gcc/g++来进行对代码进行编译,本章我们将使用gdb来对代码进行调试,学习本章的前提是有一定的调试基础,有在vs等软件上有调试经历的,若无这方面经历,建议先了解一下再来阅读本篇文章;

一、调试文件的生成

        gdb是Linux下一款命令式调试工具,我们在VS等IDE进行代码编写时,我们编写完代码,若代码运行结果不如我们所料,我们通常会去进行调试,而这里有一个细节,我们点F5编译并运行程序时,实际上这里的编译有两种选择,一种的Debug版本,另一种就是Release版本,我们必须选择Debug版本才可以进行调试,而gcc中默认是Release版本进行编译的,我们必须带上 -g选项才可,如下图所示,我写了如下代码,并进行编译;

#include <stdio.h>
// 从1加到100
int AddToHun()
{
   printf("Enter AddToHun\n");
   int ret = 0;
   int i = 0;                                                                                                                                             
   for(i = 0; i <= 100; i++)
   {
     ret += i;
   }
   printf("Exit AddToHun\n");
   return ret;
  }
 
int main()
{
   printf("Enter Main\n");
 
   int n = AddToHun();
 
   printf("ret=%d\n", n);
 
   printf("Exit Main");
   return 0;
}

        我们用下面指令分别编译出Release版本和Debug版本;

        我们不难看出我们的Debug版本比Release版本大一些,因为我们的Debug版本要保存调试信息,我们可以通过 readelf 来查看Debug版本是否真的保存了调试信息;

readelf -S 文件名

        我们看到其中保存了很多关于debug的信息;

二、调试指令

1、选择调试文件

        我们分别用Release版本的可执行程序和Debug版本的可执行程序进行调试,看是否如我们所料,Release版本可执行程序不可调试,以下为选择调试文件的指令;

gdb 要调试的文件

        我们选择Release版本可执行程序,我们发现gdb没有找到我们的调试信息,如上图所示,接着我们在试着选择Debug版本文件(输出q退出gdb);

        我们发现,刚才的提示消失了,证明了我们的Debug版本的可执行程序才可进行调试;

2、查看代码

l 行号:从指定行开始查看部分代码,我们需要继续输入 l ,才会显示后面的代码;

注意:我们可以直接回车换行,因为我们的gdb有记录上一次执行命令的功能;

3、运行代码

这里运行代码我们介绍三个指令,分别对应VS中的F5,F10和F11

r:运行代码直至遇到断电或程序结束(F5)

n:逐过程运行代码,遇到函数不进去(F10)

s:逐语句运行代码,遇得到函数进去(F11)

4、断点

b 行号:给指定行打上断点,此时gdb会给该断点分配编号

info b:显示当前有那些断点

d 断点编号:删除指定断点编号的断点

disable 断点编号:使指定断点失效

enable 断点编号:使指定断点有效

c:执行到程序末尾或下一个断点处停下来

5、打印与常显示

p 变量名:显示指定变量的值

display 变量名:常显示指定变量名(每次执行都会打印该变量值)

6、其他

bt:查看当前调用堆栈

finish:完成当前函数后停下来

until 行号:跳转至指定行

总结

        对于新手来说,我们学会上述所有指令即可,上述指令已经可以满足大部分需求,若有其他需求查看文档即可;

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

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

相关文章

实验室用超声波清洗机哪家好

随着超声波清洗机在实验室得到广泛应用&#xff0c;超声波清洗机厂家也随之增多&#xff0c;品牌、型号更是数不胜数&#xff0c;价格相差也是十分悬殊。那么面对纷繁复杂的实验室超声波清洗机市场&#xff0c;实验室用超声波清洗机哪家好&#xff1f;小编推荐国内知名超声波清…

《动手学深度学习 Pytorch版》 9.3 深度循环神经网络

将多层循环神经网络堆叠在一起&#xff0c;通过对几个简单层的组合&#xff0c;产生一个灵活的机制。其中的数据可能与不同层的堆叠有关。 9.3.1 函数依赖关系 将深度架构中的函数依赖关系形式化&#xff0c;第 l l l 个隐藏层的隐状态表达式为&#xff1a; H t ( l ) ϕ l …

用宝塔部署静态html页面

云服务器安装宝塔面板搭建LNMP环境&#xff0c;可以看另一文零基础搭建个人网站详细流程。 本文主要介绍用宝塔部署静态页面&#xff0c;比较简单&#xff0c;以部署一个用户协议为例。 首先&#xff0c;去“网站”中“添加站点”。有域名用域名&#xff0c;没域名用IP。 然后…

NSSCTF做题(10)

叫10好听一点&#xff0c;就是补9的 第7页的内容 [SWPUCTF 2022 新生赛]ez_sql get传参说是不安全&#xff0c;那就只能用post了 有回显了&#xff0c;两个假的flag 发现万能密码 1 or 11#变成了 11# 11# 1 11#1# 11# 11# 发现or和空格都无了&#xff0c;union也过滤 …

零基础Linux_19(进程信号)产生信号+Core_Dump+保存信号

目录 1. 信号前期知识 1.1 生活中的信号 1.2 Linux中的信号 1.3 信号概念 1.4 信号处理方法的注册 2. 产生信号 2.1 通过终端按键产生信号 2.2 调用系统调用向进程发信号 2.3 软件条件产生信号 2.4 硬件异常产生信号 3. 核心转储Core Dump 4. 保存信号 4.1 信号在…

day08_面向对象_封装_继承_this_super_访问修饰符

今日内容 1.作业 2.封装 3.继承 4.this和super 5.访问修饰符 零、复习 成员变量和局部变量(画表格) this的作用 this是当前对象,当前方法的调用者this可以调用属性和方法this.属性, this.方法名(),this() 构造方法的作用和语法特征 作用: 创建对象,属性初始化特征: 没有返回值,…

数据结构和算法(13):优先级队列

概述 按照事先约定的优先级&#xff0c;可以始终高效查找并访问优先级最高数据项的数据结构&#xff0c;也统称作优先级队列 优先级队列将操作对象限定于当前的全局极值者。 根据数据对象之间相对优先级对其进行访问的方式&#xff0c;与此前的访问方式有着本质区别&#xf…

PostgreSQL与MySQL数据库对比:适用场景和选择指南

数据库是现代应用程序的基石之一&#xff0c;而在选择合适的数据库管理系统&#xff08;DBMS&#xff09;时&#xff0c;开发者常常会面临着许多选择。在这方面&#xff0c;PostgreSQL和MySQL是两个备受瞩目的选项。本文将深入研究这两者之间的异同&#xff0c;并为您提供适用场…

疯狂星期四的营销策略是什么?如何复制?

你知道疯狂星期四吗&#xff1f;它的策略是什么&#xff1f;如何对标它写一个类似的方案呢&#xff1f; 1、消费者心理 KFC疯狂星期四的核心目标消费者是对价格敏感的年轻人和家庭消费者。他们寻求物有所值的美食体验&#xff0c;希望在合理的价格范围内享受到美味的食物。通过…

Unity之ShaderGraph如何实现UV抖动

前言 今天我们通过噪波图来实现一个UV抖动的效果。 如下图所示&#xff1a; 关键节点 Time&#xff1a;提供对着色器中各种时间参数的访问 UV&#xff1a;提供对网格顶点或片段的UV坐标的访问。可以使用通道下拉参数选择输出值的坐标通道。 SimpleNoise&#xff1a;根据…

论文导读 | 支持事务与图分析的图存储系统

事务系统保证了系统的数据一致性&#xff0c;确保事务更新的原子性或是不同事务之间的数据隔离性等在多线程并发环境下所必不可少的ACID特性。而在今天快速变化的商业环境下&#xff0c;诸如物流和供应链&#xff0c;金融风控和欺诈检测等场景都需要图分析系统提供对数据动态更…

Node.js在Python中的应用实例解析

随着互联网的发展&#xff0c;数据爬取成为了获取信息的重要手段。本文将以豆瓣网为案例&#xff0c;通过技术问答的方式&#xff0c;介绍如何使用Node.js在Python中实现数据爬取&#xff0c;并提供详细的实现代码过程。 Node.js是一个基于Chrome V8引擎的JavaScript运行时环境…

SEAL:RLWE-BFV 开源算法库

参考文献&#xff1a; GitHub - microsoft/SEAL: Microsoft SEAL is an easy-to-use and powerful homomorphic encryption library.[HS13] Halevi S, Shoup V. Design and implementation of a homomorphic-encryption library[J]. IBM Research (Manuscript), 2013, 6(12-15…

UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)

在UML类图中&#xff0c;常见的有以下几种关系: 泛化&#xff08;Generalization&#xff09;, 实现&#xff08;Realization&#xff09;&#xff0c;关联&#xff08;Association)&#xff0c;聚合&#xff08;Aggregation&#xff09;&#xff0c;组合(Composition)&#x…

【python零基础入门学习】python进阶篇之OOP - 面向对象的程序设计

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

MS5248数模转换器可pin对pin兼容AD5648

MS5228/5248/5268 是一款 12/14/16bit 八通道输出的电压型 DAC&#xff0c;内部集成上电复位电路、可选内部基准、接口采用四线串口模式&#xff0c;最高工作频率可以到 40MHz&#xff0c;可以兼容 SPI、QSPI、DSP 接口和 Microwire 串口。可pin对pin兼容AD5648。输出接到一个 …

潮玩IP助力环境保护,泡泡玛特发布行业首款碳中和产品

在今年的2023上海PTS国际潮流玩具展上&#xff0c;泡泡玛特正式发布了首款“碳中和”潮玩产品DIMOO X蒙新河狸手办&#xff08;下简称DIMOO河狸&#xff09;&#xff0c;通过环保主题与流行文化的联合&#xff0c;让年轻人知道野生动物保护有多种方式&#xff0c;同时以创新的设…

Crypto(3)NewStarCTF 2023 公开赛道 WEEK2|Crypto-不止一个pi

题目代码 from flag import flag from Crypto.Util.number import * import gmpy2 p getPrime(1024) #这行生成一个大约1024位长度的随机素数&#xff0c;并将其赋给变量p。 q getPrime(1024) #类似地&#xff0c;这行生成另一个大约1024位长度的随机素数&#xff0c;并将其…

Fortinet详解如何量化网安价值,把握网安态势

网络安全价值量化是企业准确把握自身网络安全态势的前提&#xff0c;也是网络安全管理人员持续推动工作的有力支撑。网络安全行业发展迅速&#xff0c;其价值量化也在不断地演进&#xff0c;如何进行量化则一直都是企业和网络安全管理人员的挑战。近期&#xff0c;Fortinet 委托…

【视觉算法系列2】在自定义数据集上训练 YOLO NAS(上篇)

提示&#xff1a;免费获取本文涉及的完整代码与数据集&#xff0c;请添加微信peaeci122 YOLO-NAS是目前最新的YOLO目标检测模型&#xff0c;它在准确性方面击败了所有其他 YOLO 模型。与之前的 YOLO 模型相比&#xff0c;预训练的 YOLO-NAS 模型能够以更高的准确度检测更多目标…