Linux调试器gdb

news2024/9/25 19:22:24

本文已收录至《Linux知识与编程》专栏!
作者:ARMCSKGT
演示环境:CentOS 7 

  


目录

前言

正文

下载gdb

生成可调式文件

进入gdb

gdb常用指令

查看代码 l 

运行程序 r 

断点设置 b 

显示信息 info 

查看断点 info b 

删除断点 d 

禁用断点 disable breakpoints 

启用断点 enable breakpoints 

逐过程调试  n 

逐语句调试 s 

查询变量 p 

查询变量值常显示 display 

取消变量常显示 undisplay 

查询变量类型 ptype 

修改变量值 set var 

逐断点运行 c 

执行到当前函数的return后停下 finish 

跳转到指定代码行 until 

查看调用堆栈 bt 

查询当前栈帧中各变量参数 info locals 

退出gdb指令 quit 

部分指令的简写和全称

最后


前言

前面我们介绍了gcc/g++的使用,我们知道在VS平台下编写代码是可以调试的,调试是我们经常使用的纠错手段,在Linux平台下也有相关的调试工具,那就是gdb,调试是我们必须掌握的技能,没有调试项目的错误就无法快速解决!


正文

下载gdb


有些纯净Linux系统默认没有gdb,需要手动安装!

指令:

sudo yum -y install gdb 

生成可调式文件


程序的发布方式有两种,debug模式和release模式,Linux工具gcc/g++出来的二进制程序默认是release模式,要使用gdb调试,必须在源代码生成二进制程序的时候加上 -g 选项!


指令:

gcc -g [编译文件]  //g++操作与此相同

 

release模式的二进制程序也可以进入gdb,但是只能运行,不能查询任何参数信息!

进入gdb


指令:

gdb [可执行程序]

gdb界面

gdb常用指令


在gdb中,输入一个指令后,下次不输入指令回车执行的是上一条指令,所以调试时如果接下来将长时间使用一条指令,则一直回车即可!


查看代码

l           //查看第一行到第十行的代码(第一次执行时)
l [行号]    //查看程序从该行开始的前后五行代码(如果前面没有代码则向后显示十行)
l [函数名]  //显示该函数位置的前后五行代码(共十行)

说明:gdb在执行l指令后,再次回车会展示后十行代码!

选择行号1然后回车显示后10行代码,再次回车继续显示!
如果选择中间行,则会展示前后五行(共十行)
gdb也可以显示代码中某函数的前后代码(默认也是前后五行)

运行程序

r  //启动程序(有断点则运行到第一个断点处停下,没有则直接运行到结束)
在gdb中r指令相当于VS下的快捷键F5

 说明:一般使用gdb都是先展示代码,然后运行程序,这样可以对照代码检查运行结果,在gdb中对于死循环的程序仍然可以使用CTRL+c退出程序,但不会退出gdb!


断点设置

b [行号]    //在该行打下断点
b [函数名]  //在该函数行打下断点

 注意:对函数名打断点,断点会落在该函数执行的第一条语句!


显示信息 info 

info [gdb指令]  //部分指令可以通过info查看详细信息
i [gdb指令] //简写为i
info可以查看相关的指令信息,其中最常用的是breakpoints选项(简写为b)

 说明:直接输入info指令会显示该指令的所有可操作选项!


查看断点 info b 

//查看所有断点信息
info b //简写
info breakpoints
info break

在gdb中info b指令是经常使用的查看断点的指令,当然info也不止于此!

通过info b查看断点的详细信息!

在断点信息中我们会发现有Num一行编号,这个编号是让我们更好的对断点进行区分,当我们删除1号断点再次添加断点时,新断点为3号,断点顺序并未修改!当我们退出gdb时所有断点信息才会失效!

  

而且这些编号在进行关于断点的其他操作时,也会用到,例如删除断点需要这些编号指定


删除断点 d 

d [断点编号]  //删除该编号断点
d //删除所有断点
d breakponits //删除所有断点


禁用断点 disable breakpoints 

disable breakpoints [断点编号]  

说明:有时候在进行大项目测试时,我们会打许多断点,我们不想让程序运行到某就停下断点,但是也不想删除断点,这时可以禁用断点!

当断点被禁用后,程序运行到该行时就不会停下了!

启用断点 enable breakpoints 

enable breakpoints [断点编号]

说明:当我们想使用被禁用的断点时,使用该指令可以启用断点!


逐过程调试  n 

n //从断点处开始进行逐过程调试

逐过程调试不会进入函数,直接返回函数执行完的结果!

调试时执行的函数代码会显示代码行号!

逐语句调试

s  //从断点处开始逐语句调试

逐语句调试会进入函数中,将每一条语句运行展示!

调试时的每一条语句都会显示其所在代码中的行号!

查询变量

p [变量]  //查看变量值
p(变量)
print [变量]
print(变量)

查看变量的方式可以简写,也可以通过括号将需要查询的变量括起来! 


查询变量值常显示 display 

display [变量]  //让变量值随查询的运行一直更新显示

添加常显示后,程序每走一步(或一句)都会显示变量的常显示变量的变化! 

当变量常显示后每执行一条语句就会显示变量 i 的变化情况

说明:常显示中的变量前的编号与取消该变量的显示操作相关!常显示列表中的编号只会随着添加越来越大,并不会一直以1为开始!


取消变量常显示 undisplay 

undisplay [常显示列表编号]  //取消变量在列表中的常显示

说明:取消常显示并不是指定变量,而是指定其在常显示中的编号!因为在C++中,不同类和不同遇可能有相同的变量,此时会混淆!


查询变量类型 ptype 

ptype [变量]  

因为我们查询变量值时只能获取变量的值,如果需要获取变量的类型则可以使用这个指令!


修改变量值 set var 

set var [变量] = [设置的值]

在程序运行时可能我们想一次性迭代到某数值,使用set var就能完成!


逐断点运行

c  //逐断点按顺序跳转执行

当我们想在断点之间运行时,直接使用该指令即可,相当于VS的F5快捷键!

在执行该gdb指令前需要r指令让程序运行!

执行到当前函数的return后停下 finish 

finish  //让程序执行return语句后停下

指令要求:必须在有返回值的函数中运行且必须让程序先运行起来!


跳转到指定代码行 until 

until [代码行号]  //让执行位置跳转到指定行

当我们想要去某一条语句查看运行情况时可以使用此指令跳转!

说明:如果前面有未执行的代码该指令会运行到指定代码行号然后停下,如果是跳转到执行过的代码,则会从该行开始继续执行!


查看调用堆栈 bt 

bt  //查看函数调用,以栈的顺序显示

当我们需要查看函数相互之间的调用时可以使用该指令!该指令需要先运行程序才能查看,因为程序运行时会先为函数建立栈帧,没有运行程序就没有栈帧!


查询当前栈帧中各变量参数 info locals 

info locals

当我们正在某一函数中调试时,通过该指令可以查看该函数中所有变量的值!


退出gdb指令 quit 

quit  //或使用 CTRL+d 也可以!
q     //也可以使用简写形式

退出gdb只需要输入q(quit)即可,或者使用快捷键CTRL+d,如果有程序正在调试没有退出,则gdb会先询问!


部分指令的简写和全称

llist
rrun

n

next
sstep
bbreak
i binfo break
ffinish
pprint
ccontinue
ddelete breakpoints
uuntil
bt breaktrace
qquit

最后

Linux调试器gdb的介绍到这里就结束了,相信gdb的学习可以助力你在Linux相同上更顺利的构建大型工程,从容的面对各种bug,虽然在使用上与VS还有些差异,但是配合Linux上的其他工具一定可以使效率有一定的提升!

本次Linux调试器gdb的基本知识就介绍到这里啦,希望能够尽可能帮助到大家。

如果文章中有瑕疵,还请各位大佬细心点评和留言,我将立即修补错误,谢谢!

 🌟其他文章阅读推荐🌟

Linux编辑器vim-CSDN博客

Linux 编译器 gcc/g++-CSDN博客

Linux项目自动化构建工具make/Makefile-CSDN博客

🌹欢迎读者多多浏览多多支持!🌹

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

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

相关文章

CentOS7突然没法上网【Network 中wired 图标消失】

参考文章(七种办法):CentOS 7 右上角网络连接图标消失,设置网络有线消失解决办法 正常图标消失,先在 终端命令 依次执行以下命令 service NetworkManager stop service network restart service NetworkManager start 一、问题真烦 CentOS7图形化界面安装…

Day893.MySQL 实例健康状态检测方法 -MySQL实战

MySQL 实例健康状态检测方法 Hi,我是阿昌,今天学习记录的是关于MySQL 实例健康状态检测方法的内容。 在一主一备的双 M 架构里,主备切换只需要把客户端流量切到备库;而在一主多从架构里,主备切换除了要把客户端流量切…

搭建企业级docker仓库—Harbor

一、简介 docker 官方提供的私有仓库 registry,用起来虽然简单 ,但在管理的功能上存在不足。 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,harbor使用的是官方的docker registry(v2命名是distribution)服务去完成。harbor在…

String是如何保证不变的?反射为什么可以改变String的值?

String是如何保证不变的?反射为什么可以改变String的值? 1. String字符串的源码分析 String 字符串到底能不能改变已经是老生常谈的问题了,但是在面试环节中,依然能够难住不少人。 下面我们根据 JDK1.8 版本下的String源码进行…

微信Hook逆向-获取登录二维码

文章目录前言一、打开Pc微信,切换到二维码界面二、解析当前二维码内容三、利用Cheat Enginer软件扫描二维码解析文本四、寻找静态偏移五.代码获取二维码网址前言 微信二维码可以Hook获取,也可以通过找到静态偏移的方式读取 提示:以下是本篇文章正文内容…

力扣(LeetCode)240. 搜索二维矩阵 II(C++)

题目描述 枚举 枚举整个矩阵&#xff0c;找到等于 target 的元素&#xff0c;则 return true &#xff0c;否则 return false。 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int n matrix.size(), m matrix[0]…

DataWhale 大数据处理技术组队学习task2

三、Hadoop分布式文件系统 1. 产生背景 数据量越来越大&#xff0c;一台独立的计算机已经无法存储所有的数据---->将大规模的数据存储到成百上千的计算机中------为了解决数据管理以及维护极其繁琐与低效------>分布式文件系统 分布式文件系统是管理网络中跨多台计算机…

基于SSM框架的狼途汽车门店管理系统的设计与实现

基于SSM框架的狼途汽车门店管理系统的设计与实现 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、…

AutoCAD学习之基本操作学习笔记

AutoCAD学习 基本操作&#xff08;23.2.15~23.2.17&#xff09; CtrlN 新建一个CAD文档F7 删除格栅F3 对象捕捉&#xff08;很重要啊&#xff0c;如果一直开着&#xff0c;操作起来很费劲。&#xff09;&#xff0c;需要关掉&#xff0c;注意使用snipaste&#xff0c;会不停地…

QT 文件监视系统QFileSystemWatcher监视目录的改变directoryChanged和监视文件的改变fileChanged

QT 文件监视系统QFileSystemWatcher监视目录的改变相关操作说明mainwindow.hmainwindow.cpp调试结果相关操作说明 添加头文件 Header: #include qmake: QT core bool QFileSystemWatcher::addPath(const QString &path)如果路径存在&#xff0c;则会向文件系统监视器添…

Prometheus Docker安装及监控自身

前提环境&#xff1a; Docker环境 涉及参考文档&#xff1a; 安装Prometheus开始 Prometheusnode_exporter Agent组件 一、部署Prometheus 1、启动容器将文件拷贝出来 docker run -d prom/prometheus2、容器将文件拷贝出来 docker cp 容器ID:/usr/share/prometheus/conso…

深度学习笔记:误差反向传播(1)

1 计算图 计算图使用图&#xff08;由节点和边构成的图&#xff09;来表达算式。 如图&#xff0c;我们用节点代表运算符号&#xff0c;用边代表传入的参数&#xff0c;即可算出购买苹果和橘子的总价格。 2 计算图的局部计算 局部计算意味着每个节点只处理和其相关的运算&…

网页设计html期末大作业

网页设计html期末大作业网页设计期末大作业-自制网站大一期末作业&#xff0c;外卖网站设计网页设计期末大作业-精美商城-首页框架网页设计期末大作业-自制网站 有导航栏&#xff0c;轮播图&#xff0c;按钮均可点进去&#xff0c;如下图所示 点我下载资源》》》》 大一期末…

linux ubuntu查日志信息以及错误排查

目录 一、linux的日志文件 1、常用日志文件 2、其他日志文件 二、历史日志的查看 1、查看Logrotate的配置信息 2、查看日志配置 一、linux的日志文件 Linux系统中最有趣的(可能也是最重要的)目录之一是/var/log。根据文件系统层次结构标准&#xff0c;在系统中运行的大多数…

java面试题-泛型异常反射

泛型1.什么是泛型&#xff1f;Java是一种强类型语言&#xff0c;数据类型在编译时必须确定。如果我们想要在代码中使用不同类型的数据&#xff0c;那么就需要为每种类型分别写出相应的代码。这样会导致代码冗长、重复&#xff0c;也不便于维护。为了解决这个问题&#xff0c;Ja…

嵌入式Linux入门级板卡的神经网络框架ncnn移植与测试-米尔i.MX6UL开发板

本篇测评由电子发烧友的优秀测评者“ALSET”提供。 米尔 MYD-Y6ULX-V2 开发板&#xff0c;基于 NXP i.MX6UL/i.MX6UL L处理器&#xff0c;该开发板被米尔称之为经典王牌产品。本次测试目标是在此开发板上进行神经网络框架ncnn的移植与测试开发&#xff0c;测试ncnn在此开发板上…

高可用的“异地多活”架构设计

前言 后台服务可以划分为两类&#xff0c;有状态和无状态。高可用对于无状态的应用来说是比较简单的&#xff0c;无状态的应用&#xff0c;只需要通过 F5 或者任何代理的方式就可以很好的解决。后文描述的主要是针对有状态的服务进行分析。 服务端进行状态维护主要是通过磁盘…

Orin 安装CUDA CUDNN TensorRT Opencv和输入法的环境配置

有两种方法可以安装CUDA环境 第一种方法-用命令按照 在刷机完成的Orin&#xff0c;执行如下命令&#xff1a; sudo apt update sudo apt upgrade sudo apt install nvidia-jetpack -y注释–如果在执行第三行命令&#xff0c;报错的话&#xff0c;先查看nvidia-l4t-apt-so…

初识K8s

概览 k8s 概念和架构从零搭建K8s 集群k8s 核心概念搭建集群监控平台搭建高可用k8s集群集群环境 实际部署项目 k8s 概念和架构 1、K8S概述和特性 概述&#xff1a; k8s是谷歌在2014年开源的容器化集群管理系统使用k8s进行容器化应用部署使用k8s利于应用扩展k8s目标实施让部…

AcWing3416.时间显示——学习笔记

目录 题目 代码 AC结果 思路 关键步骤 题目 3416. 时间显示 - AcWing题库https://www.acwing.com/problem/content/description/3419/ 代码 import java.util.Scanner;public class Main {public static void main(String[] args){Scanner input new Scanner(System.in…