GDB的学习

news2025/1/24 8:30:01

目录:

  • 什么是gdb?
    • gdb的安装
      • gdb的使用
  • gdb的一些骚操作
    • watch命令的使用
      • 调试core文件

什么是gdb?

gdb的全称是GNU debugger,看名字就知道 gdb 是用来对程序进行 debug 的,不管是学习还是工作中,用好gdb,能让你的程序更加丝滑!

gdb的安装

我是在腾讯云服务器上安装的gdb功能,大家也可以去阿里云等这些服务器上安装!

yum install gdb

gdb的使用

在linux环境下写一个程序编译运行:
在这里插入图片描述

在这里插入图片描述
-g:编译带上调试信息,这一步很重要不能丢了,有了这一步我们才能进入gdb调试。

gcc -g test.c

进入gdb调试

gdb ./a.out

在这里插入图片描述
run命令可以让我们程序跑起来,就可以看到输入,结果1,2,3,4了,后面我们可以使用gdb相应的命令执行一些基本的操作:
b break :打断点
1.在函数的地方或接函数名子打断点
如:gdb b main
2.gdb b x 在第x行打断点
quit:退出gdb模式
list:查看我们的源代码 行数太多可以重复使用list
next:一步一步调试
info b:查看断点
print:打印变量
step:进去某一个具体的函数调试 +next

这里演示几条相关的命令:
break命令的用法演示:
在这里插入图片描述
这里我们给第三行代码打了断点,然后next可以一步步往下调试,命令是可以简写的哈,run运行就能显示出第几行的代码便于观察!

print命令的用法演示:
在这里插入图片描述
通过print打印arr[0]和arr[1]的地址我们发现整型1和2相差了4个字节,说明p打印没有问题。

step命令的用法演示:
在这里插入图片描述
这里我们复制了一份test.c文件的代码,里面加了个hello()函数,下面是list查看到里面的代码:
在这里插入图片描述
在这里插入图片描述
我们写的函数在14行,那么我们就在14行这里打一个断点,这样就可以使用step命令进入到hello()这个函数调试,第4行表示函数写在test1.c文件的第4行,然后next就打印出来了我们这个函数 hello echo~。

那么我们step命令和next命令有什么关联呢?
next / step —— 让程序往下走“一步”:当程序执行到我们设置断点的地方然后停下来了,这个时候我们想要看看程序接下来是怎么变化的,可以使用 next / step命令。其中step和next都表示让程序单步执行一行代码,但是它们的主要区别在于如果下一行是函数调用的话,step会跳进函数里面继续执行,而next命令则直接执行完这个函数。

gdb的一些骚操作

gdb还可以用来查看我们当前路径下的文件,也也是说gdb可以通过shell去输入一些shell的命令的。
在这里插入图片描述
gdb的日志功能:

set logging on

在这里插入图片描述
在这里插入图片描述
输入vim gdb.txt我们看到刚才的gdb输入和调试过程就被记录在这个gdb.txt的文件里面了。

在这里插入图片描述

我们在工作的时候需要调试很多代码,有时候有记不住,这时候就可以用到日志的一个功能。

watch命令的使用

观察变量是否变化,
在这里插入图片描述
i是我们的一个变量,watch接变量名或地址设置观察点watchpoint,info查看我们的这个观察点,下面我们看到新的值从0变成1了,当我们要观察一个变量的时候就可以用到watch命令。

调试core文件

在这里插入图片描述
在这里插入图片描述

输入ulimit -a是显示目前资源限制的设定,也就是当前这个shell用户可以对这些资源进行限制,红线标记处的core file size默认设置是0,那么输入ulimit -c unlimited就可以重新设置我们的core文件的最大值,黄色标记处有了一个core dumped,生成这个文件之后,ll命令查看就有了一个名为24900的core文件,再次运行这个文件就找到了我们程序在呢挂掉的,下面画红线处,在第五行出错了。
在这里插入图片描述
这就是今天的GDB的学习,当然GDB还要很多的命令,大家也可以去官网学,这些你们学到了吗?

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

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

相关文章

redis五种数据类型具体时候的底层编码

redis随着值的类型不同,其在底层编码类型会不相同。目前现有的编码格式有 #define OBJ_ENCODING_RAW 0 /* Raw representation */ #define OBJ_ENCODING_INT 1 /* Encoded as integer */ #define OBJ_ENCODING_HT 2 /* Encoded as hash table */ #def…

RabbitMQ集群部署之普通模式

1.集群分类 在RabbitMQ的官方文档中,讲述了两种集群的配置方式: 普通模式:普通模式集群不进行数据同步,每个MQ都有自己的队列、数据信息(其它元数据信息如交换机等会同步)。例如我们有2个MQ:m…

chatgpt赋能python:Python怎么再加一个的SEO

Python怎么再加一个的SEO 作为一名有10年Python编程经验的工程师,我深知如何将Python项目优化为搜索引擎友好的代码。当谈到SEO时,构建优化的代码比任何其他技术都更加重要。在本文中,我将介绍一些Python中的关键SEO技巧,并强调如…

Spring 事务管理方案和事务管理器及事务控制的API

目录 一、事务管理方案 1. 修改业务层代码 2. 测试 二、事务管理器 1. 简介 2. 在配置文件中引入约束 3. 进行事务配置 三、事务控制的API 1. PlatformTransactionManager接口 2. TransactionDefinition接口 3. TransactionStatus接口 往期专栏&文章相关导读 …

【前端 - CSS】第 11 课 - 选择器

欢迎来到博主 Apeiron 的博客,祝您旅程愉快 ! 时止则止,时行则行。动静不失其时,其道光明。 目录 1、缘起 2、基础选择器 2.1、标签选择器 2.2、类选择器 2.3、id 选择器 2.4、通配符选择器 3、画盒子 4、总结 1、缘…

chatgpt赋能python:如何使用Python删除变量中的数据?

如何使用Python删除变量中的数据? Python是一种非常流行的编程语言,许多开发人员使用它来开发高效和可靠的应用程序。在处理数据时,Python提供了一些内置功能来执行一些基本任务。本文将探讨如何使用Python删除变量中的数据的方法。 什么是…

差动保护原理

差动保护是输入的两端CT矢量差,当达到设定的动作值时启动动作元件。保护范围在输入的两端CT之间的设备(可以是线路,发电机,电动机,变压器等电气设备) 什么是差动保护 电流差动保护是中的一种保护。正相序是…

UDP协议和TCP协议

目录 UDP TCP 通过序列号与确认应答提高可靠性 为什么TCP是三次握手 为什么是四次挥手 超时重传机制 流控制 利用窗口控制提高速度 窗口控制与重发控制 拥塞控制 延迟确认应答 捎带应答 UDP UDP是不具有可靠性的数据报协议。细微的处理它会交给上层的应用去完成。…

总结一下js的浅拷贝和深拷贝

js中对象的赋值是通过将一个对象的引用赋值给另一个变量,两个变量指向同一个内存地址。这意味着如果更改其中一个对象的值,另一个对象的值也会更改。 浅拷贝是将一个对象的值复制给另一个对象,但如果对象中包含对其他对象的引用,…

Linux虚拟网络设备---之Veth pair详解

本文目录 1、我们可以用以下命令来创建veth pair: veth0----veth12、创建二个命名空间namespaces后,可以用以下命令将二个veth设备分别移入二个命名空间ns0和ns1,并将它们连接起来。12、或者用以下命令在创建namespaces后,直接在二个namespac…

设备树的引入及简明教程

首先说明,设备树不可能用来写驱动。 设备树只是用来给内核里的驱动程序,指定硬件的信息。比如LED驱动,在内核的驱动程序里去操作寄存器,但是操作哪一个引脚?这由设备树指定。 需要编写设备树文件(dts: device tree s…

【协议】NVMe over RoCE |nvmeof

什么是nvme nvme ssd和普通ssd区别 ssd是固态硬盘,普通的ssd配的是SATA口(AHCI协议),nvme ssd配的是PCIe口(nvme传输协议) 相比普通SSD的SATA口,nvme的PCIe口有巨大的性能优势。 更多详情见&…

HTTP超详细教程

1,HTTP协议 1.1,HTTP简述 HTTP全称为超文本传输协议,是一种应用比较广泛的应用层协议。 那何为超文本? 超文本指的是传输的内容不仅仅是文本,比如 html,css,javaScript 等数据,还…

SQL使用技巧

1、行列转换: decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值); select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值 sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1 例如: 变量110,变量220 则s…

中间件定义

中间件(middleware)是基础软件的一大类,属于可复用的软件范畴。中间件在操作系统软件,网络和数据库之上,应用软件之下,总的作用是为处于自己上层的应用软件提供运行于开发的环境,帮助用户灵活、高效的开发和集成复杂的…

CTFHub | 读取源代码

0x00 前言 CTFHub 专注网络安全、信息安全、白帽子技术的在线学习,实训平台。提供优质的赛事及学习服务,拥有完善的题目环境及配套 writeup ,降低 CTF 学习入门门槛,快速帮助选手成长,跟随主流比赛潮流。 0x01 题目描述…

互斥量实现原理探究

文章目录 1. 如何实现线程的加锁和解锁2. 封装一个锁3. 可重入和线程安全3.1 可重入与线程安全联系3.2 可重入与线程安全区别 4. 常见锁概念4.1 死锁4.2 代码实现4.3 死锁四个必要条件 1. 如何实现线程的加锁和解锁 经过上一篇文章的例子,大家已经意识到单纯的 i 或…

快速在linux上配置python3.x的环境以及可能报错的解决方案(python其它版本可同样方式安装)

一. linux安装python3.x 下面案例是安装python3.9 步骤,也可以指定其他版本安装 步骤1:安装系统依赖(重要) 这一步不执行,后面各种错误。 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sql…

【Python小技巧】更换python版本解决了plt.show()不显示图像的问题

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、df.plot() 显示不出图像?二、换个python版本问题解决总结 前言 from matplotlib import pyplot as plt kdata.plot(xtrade_time, y[close,BOLL…

ThreadPoolExecutor线程池

文章目录 一、ThreadPool线程池状态二、ThreadPoolExecutor构造方法三、Executors3.1 固定大小线程池3.2 带缓冲线程池3.3 单线程线程池 四、ThreadPoolExecutor4.1 execute(Runnable task)方法使用4.2 submit()方法4.3 invokeAll()4.4 invokeAny()4.5 shutdown()4.6 shutdownN…