Linux基础环境开发工具的使用(三):gdb调试器

Linux基础环境开发工具的使用[三]:gdb调试器

  • 一.调试命令的应用场景
    • 1.为什么要介绍调试命令的应用场景呢?
    • 2.调试命令的应用场景
      • 1.找到问题
        • 1.不借助调试
        • 2.调试
      • 2.解决问题
        • 1.不借助调试
        • 2.借助调试
  • 二.调试命令
    • 1.gdb使用的前置说明
    • 2.基础指令
    • 3.断点相关指令
    • 4.范围查找相关操作
    • 5.局部逐行查找
    • 6.监视变量
    • 7.其他命令

在C语言的学习过程中,我们学习过VS这个集成开发环境下的调试功能
对于我们排查代码中的问题发挥了非常重要的作用
那么在Linux环境下有没有一种调试器能让我们去调试代码呢?
是有的,就是我们今天要介绍的gdb

一.调试命令的应用场景

1.为什么要介绍调试命令的应用场景呢?

在这里插入图片描述

2.调试命令的应用场景

在这里插入图片描述

1.找到问题

1.不借助调试

在这里插入图片描述

2.调试

在这里插入图片描述

2.解决问题

1.不借助调试

一部分人选择走读代码/看上下文的方式来发现该位置出现这个问题的原因
然后更有针对性地去解决这个问题

2.借助调试

在这里插入图片描述

二.调试命令

首先先给大家看一下gdb的调试命令:
在这里插入图片描述
下面会给大家一一介绍
但是现在首先要说明的是:

1.gdb使用的前置说明

1.安装gdb

sudo yum install -y gdb

在这里插入图片描述

gcc -o 想要生成的可执行程序 依赖的源文件 -g
或者:
gcc 依赖的源文件 -o 想要生成的可执行程序 -g

我们对待gdb的态度是:
gdb就是一个调试工具,跟VS这种调试工具的唯一区别就是使用方式不同而已,但是调试命令的应用场景是完全相同的

我们以这份代码为例:
在这里插入图片描述
下面是makefile
在这里插入图片描述
在这里插入图片描述
编译成功
然后我们gdb mytest_debug开始调试
在这里插入图片描述
刚进入调试之后是这样的

2.基础指令

在这里插入图片描述

l 行号:显示指定行之后的代码(注意:每次只显示10行,想要继续显示回车即可)

一开始这个gdb可能不会从第一行开始显示
在这里插入图片描述
所以我们可以l 1从第一行开始显示
在这里插入图片描述
一次只显示10行,我们可以回车继续再显示10行
周而复始直到显示完所有行
在这里插入图片描述

r: 从开始连续而非单步执行程序

也就是说如果我们此时没有设置断点,那么我们执行r就会直接运行到程序结束才停
在这里插入图片描述

quit:退出gdb

在这里插入图片描述

3.断点相关指令

在这里插入图片描述

b 行号/函数名/文件名:行号 :在某一行设置断点
(这个文件名:行号就意味着可以指定具体文件设置断点,
这个函数名就是对该函数内部的第一条语句位置设置断点)
info b :查看目前所设置的所有的断点信息。

我们在第15行,17行和19行都设置一个断点
然后info b来查看所有的断点信息
在这里插入图片描述
然后我们给Sum函数设置一个断点
在这里插入图片描述
然后我们指定test.c这个文件来给第10行设置断点
在这里插入图片描述
在这里插入图片描述

d n:删除编号为n的断点

然后我们删除3号断点
在这里插入图片描述

disable n:  禁用编号为n的断点
enable n:启用编号为n的断点

然后我们禁用4号断点和2号断点,接着启用2号断点
在这里插入图片描述

4.范围查找相关操作

在这里插入图片描述
目前我们程序还未运行,然后我们执行r,会运行的1号断点的位置(第15行)
在这里插入图片描述

c:从一个断点运行到下一个断点(范围查找)

然后我们c,程序会运行到2号断点位置(第17行)
在这里插入图片描述
因为我们的3号断点被删除了,4号断点被禁用了
所以我们接着c会运行到5号断点位置(第10行)
在这里插入图片描述
第5号断点已经是我们最后一个断点了,接着c,程序会运行到最后才停下
在这里插入图片描述
然后我们再info b
会发现:
在这里插入图片描述
那么我下一次调试的时候这些断点信息还会在吗?
答案是:不会,这些断点信息会自动清空
我quit退出gdb
然后在进入
在这里插入图片描述
然后我重新设置断点
在这里插入图片描述
然后我r运行到第4行

finish:将一个函数运行结束就停止下来(范围查找)

在这里插入图片描述
然后finish,程序会运行到该函数(Sum)结束为止
在这里插入图片描述
然后我想直接运行到第20行
执行until 20

until 行号:在一个范围内,直接运行到指定行(范围查找)

在这里插入图片描述

5.局部逐行查找

在这里插入图片描述

n:逐过程调试,不会进入函数体内部(就是VS中的F10)

我们重新开始进入gdb,开始下面的操作
在这里插入图片描述
然后r运行到第17行
在这里插入图片描述
接着我n
程序会运行到第19行(因为第18行是空行,没有语句)
并不会进入Sum函数当中
在这里插入图片描述
然后我们继续c,因为我们只设置了一个断点,所以继续c会直接运行到程序结束
在这里插入图片描述

s:逐语句调试,会进入函数体内部进行调试(就是VS中的F11)

然后我们依然是先r运行到第17行,
然后s
在这里插入图片描述
因为在这里插入图片描述
所以我们可以直接回车单步执行
在这里插入图片描述
这个单步执行的方式,n也一样
n和s的区别只有进不进入函数的区别

6.监视变量

在这里插入图片描述
这个时候我想看一下i,n,sum的值,i和n的地址

p 变量:显示变量的内容或地址

在这里插入图片描述
那么怎么常显示呢?

display 变量名/变量的地址:跟踪查看一个变量,常显示该变量的内容或地址(就是VS中的监视窗口)

undisplay 该变量的编号:取消对该变量的监视

我们可以display
在这里插入图片描述
我现在不想常显示sum和&i了,可以使用undisplay
在这里插入图片描述

7.其他命令

在这里插入图片描述
我现在想知道我在哪个函数里面,我是从哪个函数当中过来的
可以使用bt

bt:查看调用堆栈

在这里插入图片描述
我就可以看出我现在是在Sum函数当中,我是从main函数的第17行过来的

set var name=value:在接下来的调试过程中修改name这个变量的值为value
(没有修改文件中该变量的值,用于进行多分支(if else switch case....)测试)

下面我们来看一下这个set var的用处
我重新写一份代码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后r运行到第5行
在这里插入图片描述
现在我想测试一下a2的情况,看看我a2的那个分支是否会按我预期的一样执行
在这里插入图片描述
我们发现这样就能够在调试的过程当中可以一次性成功测试所有分支,避免了我想要去测试其他分支时还需要再去修改源代码中相应的值
在这里插入图片描述
我们新建了一个文件test1.c
然后在里面写了一个死循环
在这里插入图片描述
下面我们测试一下:
1.直接r运行->程序卡住
在这里插入图片描述
然后我们ctrl+c退出此次r运行
2.借助断点进入Sum函数执行finish
在这里插入图片描述
然后我们ctrl+c退出,然后重新r运行到18行
3.接着until运行到20行
在这里插入图片描述

以上就是Linux基础环境开发工具的使用(三):gdb调试器的全部内容,希望能对大家有所帮助!

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

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

相关文章

番外 1 : Java 环境下的 selenium 搭建

Java 环境下的 selenium 搭建 一 . 下载谷歌浏览器二 . 下载谷歌浏览器驱动2.1 查看谷歌浏览器版本2.2 下载对应版本的谷歌驱动2.3 解压下载好的驱动压缩包 , 将下载好的 chromedriver.exe 放到java 系统环境变量下 三 . 下载 Edge 浏览器的驱动3.1 查看 Edge 浏览器的版本3.2 …

【数据结构与算法】JavaScript实现单向链表

文章目录 一、单向链表简介二、封装单向链表类2.0.创建单向链表类2.1.append(element)2.2.toString()2.3.insert(position,element)2.4.get(position)2.5.indexOf(element)2.6.update(position,element)2.7.removeAt(position)2.8.其他方法2.9.完整实现 一、单向链表简介 链表…

Qt文档阅读笔记-Fetch More Example解析

Fetch More Example这个例子说明了如何在视图模型上添加记录。 这个例子由一个对话框组成,在Directory的输入框中,可输入路径信息。应用程序会载入路径信息的文件信息等。不需要按回车键就能搜索。 当有大量数据时,需要对视图模型进行批量增…

C语言精选练习题:(10)字幂数

每日一言 信心这个东西,什么时候都像个高楼大厦,但是里面会长白蚁。 --沉默的大多数 题目 打印1~100000之间的所有的字幂数,中间用空格分隔 (字幂数是指一个数的位数的n次方之和等于这个数本身) 如:370 3 ^ 3 7 ^ 3 0 ^ 3&…

我的一点记录 —— 256天

机缘 之所以开始坚持写博客,是希望可以借此对所学的知识进行一个巩固,并方便日后的复习。在CSDN这个平台,我也确实学到了很多有质量的内容,同时也希望自己可以向外输出高质量且有水平的相关知识。256天,蛮快的&#x…

(一)正点原子I.MX6ULL kernel6.1移植准备

一、概述 学完了正点原子的I.MX6ULL移植,正点原子的教程是基于Ubuntu18,使用的是4.1.15的内核,很多年前的了。NXP官方也发布了新的6.1的内核,以及2022.04的uboot。 本文分享一下基于Ubuntu22.04(6.2.0-36-generic&…

云计算——ACA学习 云计算架构

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号:网络豆云计算学堂 座右铭:低头赶路,敬事如仪 个人主页: 网络豆的主页​​​​​ 目录 写在前面 前期回顾 本期介绍 一.云计算架…

做一个springboot登陆注册功能

目录 一、环境搭建 1、数据库 2、引入依赖 3、配置信息 4、创建包结构和数据库实体类 二、接口开发-注册接口 前提准备 响应数据 需求分析 全局异常处理 代码编写 测试 三、接口开发-登录接口 前提准备 响应数据 需求分析 代码编写 测试 拦截器 测试 一、环…

超图Web许可无法访问

1. 报错 docker 容器(7f6f88XXXXX)找不到许可,查看日志,发现报错日志 2. 原因: 查看管理页面,发现许可被172.17.0.8占用 根据容器id寻找容器,找不到,猜测可能是以前删除过的容器,占用了名额 解决…

第十八章DOM操作控制

DOM操作分类: jQuery中的DOM操作 一。设置和获取样式值 1.追加样式 addClass:追加CSS效果 removeClass:去除CSS内容 2.切换样式 3.判断是否含有指定样式:判断的是布尔类型的值 二。内容操作: 1.HTML代码操作 2.TEXT代…

用示波器测量高压电

示波器本身是不可以测试几千v的高压电电路的,一般自带的探头衰减倍数不够,需要使用高压差分探头或者高压探棒,将测试信号衰减到合适的范围再接入示波器。 普通探头能测差分电压吗?差分探头和普通探头有什么区别?全网最…

1002:简单多项式求值

题目描述&#xff1a;输入任一整数&#xff0c;输出以下多项式的值。 y2x2x8 输入&#xff1a;输入整数x的值。 输出&#xff1a;输出一个整数&#xff0c;即多项式的值。 程序代码&#xff1a; #include <stdio.h> int main() {int x,y;//定义两个整型变量x和yscanf(&q…

ADC学习系列(一):ADC基础概念

本章主要是进行ADC的基础概念学习&#xff0c;从模拟和数字信号进行入手&#xff0c;分析各自的优缺点和应用场合&#xff0c;从而引出数模转换的重要性。紧接着提到了ADC部分最重要的奈奎斯特采样定理&#xff0c;了解采样频率和被测信号频率之间的关系。最后介绍了ADC的采样保…

matlab背景部分最小化算法人脸检测

1、内容简介 略 18-可以交流、咨询、答疑 matlab背景部分最小化算法人脸检测 2、内容说明 matlab人脸检测 matlab人脸检测&#xff0c;背景部分最小化算法 3、仿真分析 略. 4、参考论文 略 链接&#xff1a;https://pan.baidu.com/s/1yQ1yDfk-_Qnq7tGpa23L7g 提取码&…

【LeetCode刷题-二分查找】--704.二分查找

704.二分查找 class Solution {public int search(int[] nums, int target) {if(nums.length 0){return -1;}int left 0,right nums.length - 1;while(left < right){int mid (right - left) / 2 left;if(nums[mid] target){return mid;}else if(nums[mid] < targe…

Pytorch损失函数、反向传播和优化器、Sequential使用

Pytorch_Sequential使用、损失函数、反向传播和优化器 文章目录 nn.Sequential搭建小实战损失函数与反向传播优化器 nn.Sequential nn.Sequential是一个有序的容器&#xff0c;用于搭建神经网络的模块被按照被传入构造器的顺序添加到nn.Sequential()容器中。 import torch.nn …

不可思议,才一周,阅读量就突破千万了

这段时间&#xff0c;我发布的文章阅读量看上去还算可以&#xff0c;但我知道&#xff0c;这并不是终点&#xff0c;而是起点。我深知&#xff0c;写作的道路永无止境&#xff0c;只有不断努力&#xff0c;才能在文字的海洋中游得更远。 在这条道路上&#xff0c;我始终坚持用心…

学习率范围测试(LR Finder)脚本

简介 深度学习中的学习率是模型训练中至关重要的超参数之一。合适的学习率可以加速模型的收敛&#xff0c;提高训练效率&#xff0c;而不恰当的学习率可能导致训练过慢或者无法收敛。为了找到合适的学习率&#xff0c;LR Finder成为了一种强大的工具。 学习率范围测试&#x…

springboot项目基本配置

接口入口日志 参数校验 业务逻辑执行 异常捕获-统一异常处理 统一数据返回体 接口返回日志 使用的是springboot2.x版本。 Mybatisplus 官网地址&#xff1a;https://baomidou.com/ 导入依赖 <dependency><groupId>com.baomidou</groupId><artifactId&g…

前端工具nvm实现node自由

node的自由之路 前言 大家使用vue框架开发的朋友可能会遇到首次运行公司项目环境的时候&#xff0c;会出现使用npm install命令安装依赖包的时候出现各种各样的问题&#xff0c;其中很重要的一个错误原因就是因为你的nodejs版本和当时搭建环境的版本不一致造成的。今天就来给…