Linux基础开发工具——gdb/cgdb(7)

文章目录

  • 前言
  • 一、生成可调试文件
  • 二、调试打开与关闭
    • 启动调试
    • l 查看代码
    • 退出调试
    • 运行与断点
    • 单行与单步
  • 三、查看变量
    • bt 查看调用堆栈
    • p 临时查看变量
    • display 常显示变量
  • 四、快速跳转
    • until 指定行
    • finish 函数
    • c 断点
  • 五、其他指令
    • disable 断点使能
    • set var 设置条件
    • ptype 查看变量类型
  • 六、cgdb
    • watch 监视变量
    • 条件断点
  • 总结


前言

  Linux学习继续,话说这个操作系统的名字看起来就很酷!

  vim 可以编写代码,gcc/g++ 可以编译代码,此时只最后一件神器,就能进行完整的开发工作,那就是通过 gdb 调试代码,毕竟谁都不敢保证自己的代码没有问题,所以就有调试器这种东西帮助我们定位问题,进而解决问题


一、生成可调试文件

  在正式开始进入gdb调试环节前,我们先来检查一下是否下载好了gdb

# 用来检查
$ gdb --version# 用来下载
$ sudo yum install -y gdb

  可是当我们用gdb进入编译好的可执行文件后,会发现什么指令都用不了,除了q退出gdb程序或者r运行程序

  原因很简单:gcc/g++ 默认生成的程序为 release 发行版,也就是说不含调试信息,所以我们首先要解决这个问题

在这里插入图片描述

release 与 debug

  程序分为 release 与 debug 两个版本,其中前者是给测试工程师找毛病的,而后者则是我们开发使用的版本,debug 内置很多调试信息,因此它能很好的进行调试

  而 gcc/g++ 默认不会生成 debug 版的可执行程序,我们可以通过指令来搜索默认生成的程序中是否含有调试信息
在这里插入图片描述

  想要解决问题也很简单:在编译时,指定编译器生成 debug 版的程序就行了,又因为我们之前已经学习了Makefile,于是这样改就可以了
在这里插入图片描述
  接下来就可以愉快的进入 gdb 进行调试了

二、调试打开与关闭

启动调试

  我们调试的对象是已经生成的可执行程序,并非最开始的源文件

这很好理解,因为在VS中也是先编译、再调试

  通过 gdb + 可执行文件名字 指令可以开始调试
在这里插入图片描述
在这里插入图片描述

l 查看代码

  只要进入了 gdb ,我们可以通过 l 指令随时随地查看我们的代码,且查看代码时不会干扰其他调试命令

  l 命令一般是配合数字进行查看,每次只可查看十行,如 l 1 就表示从代码第一行开始查看其前后十行,按回车后可接着往下展示,直到代码展示完毕

(gdb) l 1	//从代码第一行开始查看其前后十行
(gdb) l	//默认查看代码最中间的十行内容

在这里插入图片描述

退出调试

  gdb 退出不像 vim 那样麻烦,指令 q 就表示退出 gdb 调试

(gdb) q	//退出 gdb 调试

运行与断点

  调试最重要的目的是帮助我们快速定位到问题,然后分析解决,此时断点就显得很重要了,如果没有断点,那只能一步步的调试,效率很低,下面就来看看如何让程序在 gdb 中跑起来及断点相关操作

r 运行程序

  gdb 中能直接快速运行程序,假设没有断点,那么程序会直接运行出结果

(gdb) r	//运行程序

在这里插入图片描述

在这里插入图片描述
  其实此时可以直接把这个看作VS中的黑框框,r 就相当于 F5 ,在没有断点的情况下,程序会直接出结果的,而最终的结果值也会紧跟着输出

b 断点操作

  断点在 gdb 中意为 breakpoint ,其中首字母 b 就表示断点的意思,因为是纯命令行操作,所以刚开始调试麻烦点是必然的

(gdb) b 行号	//在指定行号打断点
(gdb) b 函数名	//在指定函数处打断点

在这里插入图片描述
  注意: 纯命令打的断点不如图形化界面直观,但我们也可以通过指令查看断点信息

查看断点信息

(gdb) info b	//查看所有断点信息

在这里插入图片描述

编号含义

  查看断点信息时,会发现有一栏 num ,这表示每个断点的编号,因为我们不能直接对断点进行区分,于是就需要引入编号这个概念,这个概念在 gdb 很多地方都有体现

  注意: 除非 gdb 关闭,否则它的编号是一直累计的,比如我们把断点1、2都删了,然后再新打一个断点,断点编号就为3

取消断点

  有时候想取消断点,就可以通过 d 断点编号,取消指定断点

(gdb) d 断点编号	//由此可见断点编号的重要性

在这里插入图片描述
  有了断点之后,我们就可以配合 r 指令,运行至断点处
在这里插入图片描述
  注意: 不同于VS中的 F5,r 指令要么运行至最近一个断点处,要么将程序运行完,也就是说,r 是无法实现两个断点间移动的,再次按 r 会提示是否重新运行程序

单行与单步

  调试这个东西总得一步一步来,不然问题就不好找到了

n 单行调试

  单行调试即逐过程调试,对应着VS中的 F10,即遇到函数不会进入,指令为 n

(gdb) n //单行调试,不会进入函数内部

在这里插入图片描述
  单行:一行一行的来,每次运行完一行内容即可

s 单步调试

  单步调试对应着VS中的 F11 ,不同于单行调试,单步调试能进入函数内部,指令为 s

(gdb) s	//单步运行,会进入函数内部

在这里插入图片描述
  单步:即一步一步的来,如果遇到函数,就会进入函数内部,确保程序的每一步都被执行

三、查看变量

  调试过程中还有一个很重要的工作:查看变量信息,如VS中的监视窗口,假设没有监视功能,那么我们可能连变量的变化情况都无法捕捉到,庆幸的是 gdb 支持监视功能

bt 查看调用堆栈

  程序运行时,会先为 main 函数建立栈帧,然后运行程序,如果遇到函数,就会为函数建立栈帧,执行函数,因此程序的运行本质上就是栈帧的创建与销毁

  我们可以通过指令 bt 查看当前程序的堆栈调用情况

在这里插入图片描述

p 临时查看变量

  指令 p 变量 可以查看指定变量的信息

(gdb) p 变量	//查看变量的信息

在这里插入图片描述
  注意: 指令 p 只能做到临时监视,当执行下一条指令后,原来监视的变量就看不到了;可以看出,p 监视出的值也是有编号的,每调用一次指令,编号就会累加一次

display 常显示变量

  gdb 当然也支持一直监视变量,使用指令 display 即可

(gdb) display 变量	//常显示变量信息,不会随着指令的执行而消失

在这里插入图片描述
  注意: 如果我们忘记了程序中有哪些变量,可以随时随地通过 l 指令查看,像这种查看式的指令,是不会影响其他指令运行的;不难发现,常显示的变量也有属于自己的编号,这个编号运行机制跟断点的一样,只要 gdb 不退出,它是会一直累加的

  编号存在的主要意义就是方便我们进行监视变量删除:

(gdb) undisplay 变量编号	//取消监视指定变量

四、快速跳转

  gdb 提供了一些快速跳转的指令,赋予了我们在不打断点的情况下进行跳转的权力(注:先要打断点将程序运行起来),这是VS做不到的

until 指定行

  程序运行后,我们可以直接通过 until 行号 的方式跳转至指定行,这个指令通常用来跳过循环

(gdb) until 行号	//跳转至指定行

在这里插入图片描述

finish 函数

  这个指令主要是针对函数的,直接 finish 就可以在不打断点的情况下,跑完当前函数

(gdb) finish 	//在不打断点的情况下跑完当前函数

在这里插入图片描述

c 断点

  这个指令就是针对断点的了,前面说过 r 无法实现两个断点间的跳转,因此有一个专门的命令 c 进行断点跳转(注:依然需要先通过 r 指令把程序跑起来)

(gdb) c	//进行断点间的跳转

在这里插入图片描述

五、其他指令

disable 断点使能

  使能 的意思就是开关,比如电灯的开与关,我们的断点也能设置开关状态,在不取消断点的情况下让断点失效

(gdb) disable 断点编号	//关闭断点

在这里插入图片描述
能关闭当然也能打开

(gdb) enable 断点编号	//打开断点

在这里插入图片描述

set var 设置条件

  这可厉害了,可以在调试的时候直接将变量改为想要的值

ptype 查看变量类型

在这里插入图片描述

六、cgdb

  你不得不说,gdb的调试真的麻烦,所以我们需要可以安装这个更棒的调试工具——cgdb!!!

# 下载命令
$ Ubuntu: sudo apt-get install -y cgdb
$ Centos: sudo yum install -y cgdb

  一样的用 cgdb + 可执行文件名字 进入调试

在这里插入图片描述
这样是不是就好很多了,嘻嘻,谁用谁知道!!!

watch 监视变量

  执⾏时监视⼀个表达式(如变量)的值,如果监视的表达式在程序运⾏期间的值发⽣变化,GDB 会暂停程序的执⾏,并通知使⽤者
在这里插入图片描述
  如果你有⼀些变量不应该修改,但是你怀疑它修改导致了问题,你可以watch它,如果变化了,就会通知你

条件断点

  1. 条件断点添加常⻅两种⽅式:1. 新增 2. 给已有断点追加
  2. 注意两者的语法有区别,不要写错了
  3. 新增: b ⾏号/⽂件名:⾏号/函数名 if i == 30(条件)
  4. 给已有断点追加:condition 2 i==30, 其中2是已有断点编号,没有if

在这里插入图片描述


总结

  gdb 是一款功能丰富的调试器,它赋予了我们在纯命令行环境下调试代码的能力,虽然它的使用门槛高,但用熟后就会很顺手,配合我们之前学习过的 vim、gcc ,能做到像VS那样的开发环境,让我们的 Linux 使用场景更加丰富

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

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

相关文章

Python 3.13.2安装教程(安装包)Python 3.13.2 快速安装指南

文章目录 前言一 、Python 3.13.2下载二、Python 3.13.2安装教程1.运行安装程序2.选择安装方式3.自定义安装选项4.开始安装5.安装完成6.打开程序7.验证安装 前言 Python 作为一门通用编程语言,在全球拥有庞大的用户群体。其简洁易读的语法和丰富的库,使…

游戏MOD伴随盗号风险,仿冒网站借“风灵月影”窃密【火绒企业版V2.0】

游戏MOD(即游戏修改器)是一种能够对游戏进行修改或增强的程序,因其能够提升游戏体验,在玩家群体中拥有一定的市场。然而,这类程序大多由第三方开发者制作,容易缺乏完善的安全保障机制,这就为不法…

【读点论文】Chain Replication for Supporting High Throughput and Availability

在分布式系统中,强一致性往往和高可用、高吞吐是矛盾的。比如传统的关系型数据库,其保证了强一致性,但往往牺牲了可用性和吞吐量。而像 NoSQL 数据库,虽然其吞吐量、和扩展性很高,但往往只支持最终一致性,无…

新书速览|云原生Kubernetes自动化运维实践

《云原生Kubernetes自动化运维实践》 本书内容: 《云原生Kubernetes自动化运维实践》以一名大型企业集群运维工程师的实战经验为基础,全面系统地阐述Kubernetes(K8s)在自动化运维领域的技术应用。《云原生Kubernetes自动化运维实践…

Linux驱动学习笔记(六)

平台总线 1.平台总线模型也叫platform总线模型,平台总线是Linux系统虚拟出来的总线, 引入总线的概念可以对驱动代码和设备信息进行分离。平台总线模型将一个驱动分成了两个部分:platform_device和platform_driver,例如可使用文件device.c和d…

高频GNSS同震形变计算方法

高频GNSS(通常采样率为 1Hz-50Hz)可以提供高时间分辨率的地震形变信息,计算同震形变(coseismic displacement)的方法主要包括 趋势线法 和 基线法。

从简单探测到业务模拟:IT监控如何突破传统监控边界

探测是一种用于主动检测和评估IT系统、网络设备、应用服务等目标对象运行状态和性能指标的技术手段。它通过模拟用户操作、发送测试信号或执行特定的检查任务,实时获取目标对象的响应情况和相关数据,从而帮助运维人员及时发现潜在问题、评估系统健康状况…

卡特兰数在数据结构上面的运用

原理 Catalan数是一个数列,其第n项表示n个不同结点可以构成的二叉排序树的数量。Catalan数的第n项公式为:  其中,是组合数,表示从2n个元素中选择n个元素的组合数。 Catalan数的原理可以通过以下方式理解&…

CCBCISCN复盘

AWDP – ccfrum 自己搭了一下环境, 复现一下这道题目, 之前比赛的时候完全没想到这个漏洞要怎么打, 修也不知道要怎么修, 就仅仅是对用户名的账号和密码进行了一下过滤, 完全没起到作用, 唉, 实在太菜 如果想要尝试复现的话可以尝试拉取这个镜像, 我打完之后就直接把这个容器给…

【sgAutocomplete_v2】自定义组件:基于elementUI的el-input组件开发的搜索输入框(支持本地保存历史搜索关键词、后台获取匹配项)

特性&#xff1a; 支持本地记录搜索关键词后台接口匹配搜索关键词支持自定义填充字段名支持user或address两种匹配列表布局样式 sgAutocomplete_v2 <template><div :class"$options.name" mouseover"inside true" mouseout"inside false…

算法模型从入门到起飞系列——背包问题(探索最大价值的掘金之旅)

文章目录 前言一、背包问题溯源&#xff08;动态规划&#xff09;1.1 动态规划的概念1.2 动态规划的基本步骤1.3 动态规划的实际应用 二、背包问题2.1 背包问题衍生2.2 0-1背包2.2.1 0-1背包描述2.2.2 0-1背包图解2.2.3 0-1背包代码刨析 2.3 完全背包2.3.1 完全背包描述2.3.2 完…

数据库原理及应用mysql版陈业斌实验一

&#x1f3dd;️专栏&#xff1a;Mysql_猫咪-9527的博客-CSDN博客 &#x1f305;主页&#xff1a;猫咪-9527-CSDN博客 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。” 目录 实验一&#xff1a;数据库与数据表的定义和数据操作 1.实验数据如下 …

腾讯云创建DeepSeek AI应用及使用教程

文章目录 腾讯云大模型知识引擎创建 DeepSeek 应用文档一、前期准备二、创建应用1. 进入应用管理界面2. 应用配置3. 发布应用 三、管理应用四、测试应用五、API接入应用API接入文档详细链接HTTP 对话端接口文档WebSocket对话端接口文档 六、常见问题七、注意事项 腾讯云大模型知…

关于FastAPI框架的面试题及答案解析

FastAPl是一个现代、快速(高性能)的Web框架,用于构建API,基于Python3.7+的类型提示功能。它由Python开发者SebastianRamirez创建,并且使用了Starlette作为其核心组件以及Pydantic进行数据验证。 文章目录 基础篇1. FastAPI的核心优势是什么?2. 如何定义一个GET请求路由?…

Linux上位机开发实战(camera视频读取)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 关于linux camera&#xff0c;一般都是认为是mipi camera&#xff0c;或者是usb camera。当然不管是哪一种&#xff0c;底层的逻辑都是v4l2&#x…

【强化学习】Reward Model(奖励模型)详细介绍

&#x1f4e2;本篇文章是博主强化学习&#xff08;RL&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…

计算机组成原理和计算机网络常见单位分类及换算

计算机组成原理&#xff08;主要用于存储、内存、缓存等&#xff09; 计算机网络&#xff08;主要用于传输速率&#xff09; 直观对比

Elasticsearch零基础入门:从安装到入门

目录 一、Elasticsearch简介 二、环境快速搭建 1. 单节点本地部署&#xff08;Docker版&#xff09; 2. 验证安装 三、核心概念图解 与传统数据库对比 架构概念说明 四、REST API基础操作 1. 索引管理 2. 文档CRUD操作 五、基础搜索实战 1. 全文搜索 2. 精确匹配 …

数据清理工具——OpenRefine的进阶操作

第二章主要讲OpenRefine的进阶操作&#xff0c;希望能帮助你们&#xff01; 1.OpenRefine工具的数据排序功能 数据排序是一种常见的数据清理操作&#xff0c;它主要是按照指定方式排列数据&#xff0c;这样不仅可以对数据进行检查和纠错&#xff0c;还可以通过浏览排序后的数…

表格标题竖直

使用文本方式使表格怎么竖列 思路&#xff1a;表格竖直书写&#xff0c;里面的内容水平书写 使用到的是css中的文本效果&#xff1a; writing-mode&#xff1a;书写方式horizontal-tb&#xff1a;水平vertical-rl&#xff1a;竖直<style>table {writing-mode: vertical…