【Linux学习】(9)调试器gdb

前言

Linux基础工具:安装软件我们用的是yum,写代码用的是vim,编译代码用gcc/g++,调试代码用gdb,自动化构建用make/Makefile,多人协作上传代码到远端用的是git。

在前面我们把yum、vim、gcc、make、git都已经学习了,今天我们就将学习最后一种基础工具gdb调试器

调试器gdb

1. 背景——debug和release

  1. 源文件编译时有有两种模式,debug模式和release模式
  2. debug通常称为调试版本,它包含调试信息,并且不做任何优化,便于程序员调试程序(因为debug模式在形成可执行程序的时候,添加了debug信息,所以可以被追踪调试)
  3. release称为发布版本,它往往是进行了各种优化,是程序在代码大小和运行速度上都是最优的,以便用户很好的使用
  4. 在Linux系统上gcc/g++形成的可执行程序,默认是release版本
  5. 如果想以debug形式编译,我们需要添加-g选项(-g生成调试信息)
  6. 验证:readelf -S指令可以读取可执行程序对应的二进制构成,再通过grep debug可以将debug信息过滤出来在这里插入图片描述

2. 使用gdb

  • 启动gdb:gdb 可执行程序
  1. 调试需要启动gdb在这里插入图片描述
  2. 注意在Linux系统上gcc/g++形成的可执行程序,默认是release版本。
  3. 如果想以debug形式编译,我们需要添加-g选项
  • 退出gdb:quit/q
  1. 调试结束,退出gdb在这里插入图片描述
  • 查看到调试的代码:list/l
(gdb) l		#list不一定从第一行开始显示调试代码,并且只显示一部分代码
(gdb) l n	#指定显示第n行调试代码
(gdb) l function	#指定显示某函数的代码块
(gdb) l [begin,end]	#指定显示某区间的代码块
  1. list查看调试代码,注意list不一定从第一行开始显示调试代码,并且只显示一部分代码在这里插入图片描述
  2. 如果我们想从第一行开始显示所有调试代码,list 0之后继续不断list或者直接回车即可显示所有代码在这里插入图片描述
  3. gdb会自动记录最近一条指令
  • 运行程序:run/r
  1. 运行程序,直到遇到断点或者程序运行结束在这里插入图片描述
  2. 在gdb中的run指令相当于VS中运行的快捷键Ctrl+F5
  • 设置断点:break/b
(gdb) b 行号	#在某一行设置断点
(gdb) b 函数名	#在某一个函数开头设置断点,即函数代码块的起始位置第一条有效语句
(gdb) b 文件名:行号N	#在某个文件的第N行打断点,即跨文件设置断点
(gdb) b 文件名:函数名	#在指定文件的指定函数设置断点
  1. 要调试代码,我们一般都需要先设置断点在这里插入图片描述
  2. 在VS中我们设置了断点,就可以在该代码行的最左侧显示一个红点,表示在当前行设置了断点,但是在gdb中它不是图形化界面,不会显示红点也没有任何提示,那我们在gdb中我们如何知道在哪里设置了断点了
  • 查看断点信息:info break
  1. 查看断点信息在这里插入图片描述
  2. 注意当我们退出了gdb,那我们在上一次所有设置的断点就没有了
  • 删除断点:delete/d
(gdb) delete [breakpoints] n	#删除断点编号为n的断点
(gdb) delete [breakpoints]		#删除所有断点
  1. 注意删除断点是根据断点编号删除的,不能像通过断点的行号删在这里插入图片描述
  2. 删除所有断点在这里插入图片描述
  • 禁用断点:disable
(gdb) disable 断点编号N	#禁用断点编号为N的断点
  1. 有的时候我们不想删除某个断点,但也不想使这个断点起效那该怎么办呢——禁用断点在这里插入图片描述
  2. 不想删某个断点是因为想保留调试的痕迹,不想使这个断点起效是因为我们已经确定问题不在该断点处
  • 启用断点:enable
(gdb) enable 断点编号N	#启用断点编号为N的断点
  • 逐语句和逐过程:step/s & next/n
  1. 我们调试代码一般先run将代码运行至断点停下来之后,就需要逐语句或逐过程一步一步慢慢的调试代码找出问题所在
  2. 逐语句和逐过程:
    • 逐语句:遇到函数,进入函数体中,不跳过函数体中的语句
    • 逐过程:把函数也当做一个语句,直接调试到下一条语句
    • 区别:逐语句和逐过程都是一次执行一条语句,唯一的区别就在于逐语句会进入函数,逐过程不会进入函数在这里插入图片描述
  3. gdb调试会直接跳过空行,跳转到下一句有效代码处
  4. 我们现在可以gdb中设置断点,逐过程的调试代码了,但是在调试代码时我们还需要监视变量
  • 打印变量值:print/p 变量
  1. 打印变量值在这里插入图片描述
  2. 但是我们发现print打印变量的值不能边调试边打印变量值,即不能常显示变量值
  • 边调试边打印变量值(常显示变量值):display 变量
  1. 跟踪查看一个变量,每次停下来都显示它的值在这里插入图片描述
  • 取消常显示变量值:undisplay
(gdb) undisplay 变量编号	#取消指定变量编号的常显示
(gdb) undisplay			#取消所有变量的常显示
  1. 取消对常显示变量的监视,注意不是通过变量名取消的,而是通过变量编号取消的在这里插入图片描述
  • 跳转到N行:until 行号N
  1. 例如现在我们的代码陷入到了一个循环中,我们想直接把这个循环执行完,那就可以使用until直接跳转到循环的下一行在这里插入图片描述
  • 快速调试一个函数是否有bug:finish
  1. finish:执行到当前函数返回,然后停下来等待命令在这里插入图片描述
  2. 注意:使用finish需要先进入到函数
  • 从一个断点处运行到下一个断点处:continue/c
  1. continue:从当前位置开始连续而非单步执行程序,一般用于从一个断点处运行到下一个断点处在这里插入图片描述
  2. run VS continue
    • run:从开始连续 而非单步执行程序——一般run运行程序到第一个断点处停下来
    • continue:从当前位置开始连续 而非单步执行程序——一般continue从当前断点运行到下一个断点停下来
  3. until & finish & continue
    • until:在函数内范围式 的运行
    • finish:按函数为单位 的运行
    • continue:从一个断点到下一个断点 大面积的范围式的运行
    • 调试:调试的本质是先一定要找到问题,只有找到了问题位置,才能通过分析它周边的数据,分析上下文,分析出问题出错的原因,原因清楚了,我们才知道对应的解决方案!
    • 我们可以通过until、finish、continue、等操作不断地缩小定位问题所在位置。
    • 一般先使用continue不断将问题从多个函数缩小到两个函数,再通过finish将问题缩小到一个函数,最后再通until、逐语句逐过程的定位问题所在位置
  • 修改变量的值:set var 变量=变量值
  1. 例如在一个循环中,我们知道了当循环变量的值为98的时候就会出现bug,那我们怎么可以快速执行到循环变量值为98的时候呢——修改变量的值在这里插入图片描述
  • 查看各级函数调用及参数:breaktrace/bt
  1. 查看各级函数调用及参数在这里插入图片描述
  • 查看当前栈帧局部变量的值:info/i locals

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

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

相关文章

逆向工程基本概念

引言 逆向工程(Reverse Engineering)是指从已经存在的产品或系统中提取信息,并理解其设计原理的过程。在软件开发中,逆向工程通常用于理解一个已有软件系统的内部工作原理,可能是为了兼容性、安全分析、修复或者改进等…

Pyhton自动化测试持续集成和Jenkins

持续集成 官方术语: 持续集成(Continuous Integration),也就是我们经常说的 CI 持续集成(CI)是一种实践,可以让团队在持续的基础上收到反馈并进行改进,不必等到开发周期后期才寻找…

二十四、Python基础语法(变量进阶)

一、引用 在定义变量的时候, 解释器会给变量和数据分别在内存中分配内存,变量中保存的是数据的地址, 称为引用,Python 中数据的传递,传递的都是引用,可以使用 id(变量) 函数,获取变量中引用地址。 # 将数字1在内存中的地址储存到变量a中 a …

人工智能岗位英语面试 - 如何确保模型的可靠性和性能

确保模型的可靠性和性能 1. Precision Precision is a metric that measures how accurate the model’s positive predictions are. It calculates the ratio of true positives (correctly predicted positive cases) to the total number of predicted positives (both tr…

时间比较日期

现在需要一个获取当前时间然后对比一个月后的时间的java方法,比如:当前时间获取到是2024-10-28,然后我写定一个时间2024-10-29,这两个比大小,获取的当前时间要小于我写定的时间返回true否则返回false import java.time…

从头学PHP之数组输出基本函数

上期我们讲到了数组,数组是个特殊的变量,在程序中的重要程度很高,大部分数据处理的时候会用到这种特殊的变量,那么现在让我们继续深入一下吧。 上期我们打印出了数组的值,用print_r()或者var_dump()这俩函数&#xff0…

paddleocr使用FastDeploy 部署工具部署 rknn 模型

在 PC 端转换 pdmodel 模型为 rknn 模型和在板端使用百度飞浆开发的 FastDeploy 部署工具部署 rknn 模型 以下内容是在 PC 端系统为 Ubuntu20.04,板端系统为ubuntu20.04 的环境下实现的 描述: 官网地址 rknn_zoo RKNPU2_SDK …

【Linux】进程调度 | 进程切换上下文数据

🪐🪐🪐欢迎来到程序员餐厅💫💫💫 主厨:邪王真眼 主厨的主页:Chef‘s blog 所属专栏:青果大战linux 总有光环在陨落,总有新星在闪烁 小感慨: …

区块链系统控制台Console的安装与运维

【要求】 登陆Linux 服务器,安装、部署区块链系统控制台 Console,并完成节点的运维。同 时,检查控制台是否能够正常运行。 【任务】 1. 登陆 linux 服务器,进入指定操作目录按下列要求完成控制的安装与部 署,并将安装过…

Rust语言的优缺点以及学习建议

在编程世界的不断演变中,Rust 作为一种重要的语言脱颖而出。它以安全性和性能为核心,正在获得开发者们的广泛关注。但究竟什么是 Rust?它为何如此受欢迎?在这篇博客中,我们将深入探讨 Rust 的世界,探索它的…

【三十七】【QT开发应用】使用QVideoWidget播放视频,QT模块缺失时更新安装模块步骤(利用虚拟网址打开应用加速)

效果展示 下面有一个按钮打开视频&#xff0c;点击按钮之后会出现一个弹窗选择文件&#xff0c;默认打开的是D盘&#xff0c;并且选择的文件的类型有.mp4 .flv或者所有文件。选择正确的视频文件之后可以正常播放视频。 widget.h 主窗口头文件 #pragma once#include <QtWid…

【设计模式系列】适配器模式(九)

目录 一、什么是适配器模式 二、适配器模式的角色 三、适配器模式的典型应用 四、适配器模式在InputStreamReader中的应用 一、什么是适配器模式 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将不兼容的接口转换为一个客户端…

【Vue】word / excel / ppt / pdf / 视频(mp4,mov) 预览

文件预览 Vue3一. word二. excel三. ppt四. pdf4.1 vue-pdf-embed4.2 iframe 五. 视频六&#xff1a;扩展——kkFileView Vue3 一. word 安装&#xff1a;npm install docx-preview父页面 <template><div><DocPreviewv-if"filePath.includes(docx)"…

Cisco Packet Tracer 8.0 路由器单臂路由配置

文章目录 单臂路由简介一、单臂路由的原理二、单臂路由的配置步骤三、单臂路由的优缺点四、应用场景 一&#xff0c;拓扑图搭建二&#xff0c;pc IP地址配置三&#xff0c;交换机Switch0配置四&#xff0c;配置路由器Router0五&#xff0c;测试 单臂路由简介 单臂路由&#xf…

Hadoop-001-本地虚拟机环境搭建

一、安装VMware 官方下载VMware&#xff1a; https://vmware.mdsoft.top/?bd_vid5754305114651491003 二、下载镜像文件 阿里云镜像仓库&#xff1a; https://mirrors.aliyun.com/centos/ 本文档使用 CentOS-7-x86_64-DVD-1810-7.6.iso 搭建虚拟机 三、搭建虚拟机 1、编辑…

【WRF数据准备】基于GEE下载静态地理数据-叶面积指数LAI及绿色植被率Fpar

【WRF数据准备】基于GEE下载静态地理数据 准备:WRF所需静态地理数据(Static geographical data)数据范围说明基于GEE下载叶面积指数及绿色植被率GEE数据集介绍数据下载:LAI(叶面积指数)和Fpar(绿色植被率)数据处理:基于Python处理为单波段LAI数据参考GEE的介绍可参见另…

VantUI

官网&#xff1a;Vant 4 - A lightweight, customizable Vue UI library for mobile web apps. Vant组件库&#xff1a; 基础组件 按钮、图标、布局、提示信息等 表单组件 日历、复选框、时间选择、输入框、评分等 反馈组件 弹出框、加载、下拉菜单、消息提示、下拉刷新、滚动…

面试阿里、字节全都一面挂,被面试官说我的水平还不如应届生

测试员可以先在大厂镀金&#xff0c;以后去中小厂毫无压力&#xff0c;基本不会被卡&#xff0c;事实果真如此吗&#xff1f;但是在我身上却是给了我很大一巴掌... 所谓大厂镀金只是不卡简历而已&#xff0c;如果面试答得稀烂&#xff0c;人家根本不会要你。况且要不是大厂出来…

C#入坑JAVA MyBatis入门 CURD 批量 联表分页查询

本文&#xff0c;分享 MyBatis 各种常用操作&#xff0c;不限于链表查询、分页查询等等。 1. 分页查询 在 下文的 的「3.4 selectPage」小节&#xff0c;我们使用 MyBatis Plus 实现了分页查询。除了这种方式&#xff0c;我们也可以使用 XML 实现分页查询。 这里&#xff0c…

1-petalinux2018.3 摸索记录 -petalinux-config

一、petalinux-config的具体配置-ZYNQMP Configuration 1、Linux Compoment Selection Linux Compoment Selection&#xff0c;Linux组件选择. First Stage Bootloader和Auto update ps_init勾选会自动生成fsbl.elf&#xff0c;自动更新ps_init。 PMU Firmware平台管理单元固…