Linux调试器---gdb的使用

顾得泉:个人主页

个人专栏:《Linux操作系统》  《C/C++》

键盘敲烂,年薪百万!


一、gdb的背景

       gdb,全称为GNU调试器(GNU Debugger),是一个功能强大的源代码级调试工具,主要应用于Unix系统,以及Linux下的程序开发。它与GCC一样,都是源于GNU计划,同GCC、Emacs等工具同期诞生。在嵌入式开发中,gdb的使用非常广泛,对于程序的调试有着不可替代的作用,因此对每位嵌入式开发工程师而言都有着至关重要的意义。

       gdb提供了多种强大的功能,以帮助程序员查看程序在执行过程中的内部状态,如:设置断点、单步执行、查看变量值等。这些功能都极大地方便了程序员对程序的调试工作。


 二、gdb的安装

使用该指令安装gdb调试器:(Ubuntu环境)

        sudo apt-get install gdb

 如果有小伙伴使用上述命令无法安装,尝试这个命令:

        yum install -y gdb


三、Debug和Release

       默认我们已经创建好了text.c和makefile文件

        我们进行make编译:

       接着我们对text文件进行gdb调试:

       无法调试!为什么呢?

       1.程序的发布方式有两种,debug模式和release模式

       2.Linux gcc/g++出来的二进制程序,默认是release模式,release模式下无法调试

       3.要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项

       我们接下来对makefile文件进行修改,加上  -g选项:

        接下来我们尝试进行调试:

       可以进行调试了 。


四、gdb的基础使用

1.进入和退出

       进入:gdb 文件名

       退出:CTRL+d或者quit

2.查看调试的代码

 list    or   l  +  行号,显示指定行之后的代码(自动记录最后一条指令)

3.断点

1.打印断点(三种方式)

1.b+行号

2.b+函数名+行号

       由于我的疏忽忘记编辑函数,就不进行展示了,大家可以自行练习

3.b+文件名+行号(适用于多文件下)

2.查看断点

        info b

3.删除断点

       d,注意在删除断点中,显示的是编号,而不是行号。

4.使能(禁用/开启)断点

1.禁用:disable

       这里的y,n代表断点是否启用,由上图可以看出3号断点已经被禁用。

2.开启:enable

4.代码执行结束

       r,直接把要调试的代码全部执行

5.查看调用堆栈

       因为我的text文件比较简单,没有进行调用堆栈,大家感兴趣的可以自行练习。

 五、扩展完善

        list/ l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行

        list /l函数名:列出某个函数的源代码

        r或run:运行程序

        n或 next:单条执行

        s或step:进入函数调用

        break(b)行号:在某一行设置断点

        break 函数名:在某个函数开头设置断点

        info break :查看断点信息

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

        print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数

        p变量:打印变量值

        set var:修改变量的值

        continue(或c):从当前位置开始连续而非单步执行程序

        run(或r):从开始连续而非单步执行程序

        delete breakpoints:删除所有断点

        delete breakpoints n:删除序号为n的断点

        disable breakpoints:禁用断点

        enable breakpoints:启用断点

        info(或i) breakpoints:参看当前设置了哪些断点

        display变量名:跟踪查看一个变量,每次停下来都显示它的值

        undisplay:取消对先前设置的那些变的跟踪

        until X行号:跳至X行

        breaktrace(或bt):查看各级函数调用及参数

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

        quit:退出gdb


结语:Linux调试器关于gdb使用的分享到这里就结束了,没有进行展示的操作大家可以自行练习,希望本篇文章的分享会对大家的学习带来些许帮助,如果大家有什么问题,欢迎大家在评论区留言~~~ 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring 配置

配置文件最主要的目的 : 解决硬编码的问题(代码写死) SpringBoot 的配置文件,有三种格式 1.properties 2.yaml 3.yml(是 yaml 的简写) SpringBoot 只支持三个文件 1.application.properties 2.application.yaml 3.application.yml yaml 和 yml 是一样的,学会一个就行…

【Linux】冯诺依曼体系结构、操作系统、进程概念、进程状态、环境变量、进程地址空间

目录 一、冯诺依曼体系结构二、操作系统(OS)1. 操作系统是什么2. 操作系统如何做管理3. 系统调用和库函数概念 三、进程1. 进程是什么?2. 描述进程-PCB3. 查看进程的方法 四、进程状态1 运行、阻塞和挂起状态2 Linux中的进程状态 五、进程优先级1. 什么是优先级2.查…

深度学习中的图像融合:图像融合论文阅读与实战

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 abs 介绍图像融合概念,回顾sota模型,其中包括数字摄像图像融合,多模态图像融合, 接着评估一些代表方法 介绍一些常见应用,比如RGBT目标跟踪,…

全新云开发工具箱:融合多项功能的微信小程序源码解决方案

全新云开发工具箱:融合多项功能的微信小程序源码解决方案 这款微信小程序源码提供了超过40个功能,集合了各种实用工具,成为一款全能工具箱。这些功能包括证件照制作、垃圾分类查询、个性签名制作、二维码生成、文字九宫格、手持弹幕、照片压…

YOLOv8优化策略:轻量级Backbone改进 | VanillaNet极简神经网络模型 | 华为诺亚2023

🚀🚀🚀本文改进:一种极简的神经网络模型 VanillaNet,支持vanillanet_5, vanillanet_6, vanillanet_7, vanillanet_8, vanillanet_9, vanillanet_10, vanillanet_11等版本 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,…

图像分类(三) 全面解读复现VGGNet

解读一 Abstract-摘要 翻译 在这项工作中,我们研究了卷积网络深度在大规模图像识别环境下对其精度的影响。我们的主要贡献是使用具有非常小(33)卷积滤波器的体系结构对增加深度的网络进行了彻底的评估,这表明通过将深度推进到16-19个权重层&#xff0…

jbase打印完善

上一篇实现了粗略的打印元素绘制协议,并且写了打印示例和导出示例,趁着空隙时间完善一下打印。 首先元素构造函数默认初始化每个字段值 package LIS.Core.Dto;/*** 打印约定元素*/ public class PrintElement {/*** 元素类型*/public String PrintType…

DeepStream--测试resnet50分类模型

ResNet50是一种深度残差网络,50表示包含50层深度。该模型可以用于图像分类,物体检测等。 现在用DeepStream测试ResNet50分类模型。 1 资源 模型地址:https://github.com/onnx/models/blob/main/vision/classification/resnet/model/resnet…

高性能音乐流媒体服务Diosic

什么是 Diosic ? Diosic 是一个开源的基于网络的音乐收集服务器和流媒体。主要适合需要部署在硬件规格不高的服务器上的用户。Diosic 是使用 Rust 开发的,具有低内存使用率和高性能以及用于流媒体音乐的非常干净的界面。 安装 在群晖上以 Docker 方式安装。 在注…

【Android】Android Framework系列--CarUsbHandler源码分析

Android Framework系列–CarUsbHandler源码分析 本文基于Android12源码。 CarUsbHandler是Android Car提供的服务之一,其用车载USB连接的场景。 车载USB有其特殊应用场景,比如AndroidAuto、CarLife等。而Android的做法是在其原有的USB服务上&#xff0…

Js中clientX/Y、offsetX/Y和screenX/Y之间区别

Js中client、offset和screen的区别 前言图文解说实例代码解说 前言 本文主要讲解JavaScript中clientX、clientY、offsetX、offsetY、screenX、screenY之间的区别。 图文解说 在上图中,有三个框,第一个为屏幕,第二个为浏览器大小&#xff0c…

ChatGPT最强?文心一言与ChatGPT对比

对于同一个问题我们分别对文心一言3.5和ChatGPT3.5输出回答,结果如下图,可以看到文心一言的回答更好,文心一言是由百度开发的人工智能语言模型,它的中文理解能力主要是基于百度强大的搜索引擎和自然语言处理技术。文心一言更加注重…

Linux下快速确定目标服务器支持哪些协议和密码套件

实现原理是利用TLS协议的特点和握手过程来进行测试和解析响应来确定目标服务器支持哪些TLS协议和密码套件。 在TLS握手过程中,客户端和服务器会协商并使用相同的TLS协议版本和密码套件来进行通信。通过发送特定的握手请求并分析响应,可以确定目标服务器…

图解API设计风格,看一眼就忘不了了!

点击下方“JavaEdge”,选择“设为星标” 第一时间关注技术干货! 免责声明~ 任何文章不要过度深思! 万事万物都经不起审视,因为世上没有同样的成长环境,也没有同样的认知水平,更「没有适用于所有人的解决方案…

轻松掌控财务,分析账户花销,明细记录支出情况

随着科技的发展,我们的生活变得越来越智能化。然而,对于许多忙碌的现代人来说,管理财务可能是一件令人头疼的事情。复杂的账单、花销、收入,这些可能会让你感到无从下手。但现在,我们有一个全新的解决方案——一款全新…

马斯克的SpaceX星舰又炸了!发射不久后失联自毁

就在几小时前,马斯克旗下SpaceX 发射了有史以来最强大的星舰,但在发射后不久发生爆炸。 在这次发射尝试中,星舰一二级成功进行了分离,但二级助推器和星舰都发生了快速意料之外的解体。在发射半小时后,SpaceX 宣布二级自…

nginx后端服务器在负载均衡调度中的状态

状态说明 down 状态说明当前的sever暂时不参与负载均衡

腾讯云轻量数据库测评和轻量数据库配置价格表

腾讯云轻量数据库测评,轻量数据库100%兼容MySQL 5.7和8.0,腾讯云提供1C1G20GB、1C1G40GB、1C2G80GB、2C4G120GB、2C8G240GB五种规格轻量数据库,腾讯云百科txybk.com分享腾讯云轻量数据库测评、轻量数据库详细介绍、特性、配置价格和常见问题解…

unordered_map,unordered_set模拟实现

目录 一 . 底层结构--哈希 1.直接定址法 2. 除留余数法 哈希桶 3. 一些定义 二 . 模拟实现哈希表 1.哈希表框架 ​编辑 2.插入 3.查找 4 . 删除 5.解决使用问题 6.完整代码 三 .实现unordered_map, unordered_set 1. 初步实现unordered_map, unordered_set 2.…

【C++】泛型编程 ⑦ ( 模板类常用用法 | 模板类声明 | 模板类调用 | 模板类作为函数参数 )

文章目录 一、类模板基础用法1、类模板声明定义2、类模板使用3、类模板做函数参数 二、完整代码示例1、代码示例2、执行结果 一、类模板基础用法 1、类模板声明定义 上一篇博客中 , 【C】泛型编程 ⑥ ( 类模板 | 类模板语法 | 代码示例 ) 讲解了模板类的基础语法 , 模板类声明如…
最新文章