Linux调试器——gdb的基础使用

news2024/12/24 0:07:25

目录

1.背景

2.指令的使用

2.1gdb的使用和退出

2.2显示源代码

2.3运行程序

2.4调试

1.打断点

2.查断点

3.去断点

4.运行

5.关闭断点

6.启用断点

7.逐过程

8.进入函数

9.显示变量的值


1.背景

众所周知,我们的程序发布有两种,分别是debug模式和release模式,在Linux中我们主要有两种编译器——gcc和g++,一个是编译C语言程序的,一个是编译C++程序的,当我们使用这些编译器进行汇编步骤的时候,会生成一个二进制文件,Linux系统中默认它是release模式的。那如果我们想使用gdb调试器来进行调试的话该怎么做呢?

我们需要在源代码生成二进制程序的时候, 加上 -g 选项。(如图所示)

由上图所示,我们可以看到生成了一个testdebug的二进制文件。

gdb调试器对debug模式的文件才能使用,所以我们才要生成testdebug这个文件。

接下来我就来讲解一些指令要如何去使用。

2.指令的使用

2.1gdb的使用和退出

我们使用gdb直接gdb 文件就行了。

如图所示,这就说明我们的gdb使用成功了。

那么我怎么退出呢?

很简单,直接quit就能退出了。

2.2显示源代码

list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。

这是我们简单写的一段代码,接下来我会用它来进行举例说明。

如图所示,我们使用list/l时一次显示10行,我们再按回车就会再打印10行,打印完了就会停下,我们再来看看list/l + 行号:

我们发现list/l + 行号不是从你输入的行号开始往后显示10行,而是以你输入的为中间值,显示上下文,总共为10行。如果没有下文它就不显示下文嘛(没有上文同理),如图所示:

我们也可以加函数名来进行显示:

如上图所示,我们使用list/l + 函数名的方式也是查函数名的上下文总共为10个。

2.3运行程序

r或run:运行程序。

第一行表示的是我们开始运行的项目还有这个项目的位置,第二行exited normally表示的是程序正常运行结束。

2.4调试

1.打断点

我们可以b + 行号/函数名。

第二行的意思就是打了一个序号为1的断点,后面的十六进制就是它的地址,test.c就是文件名,行数在第十行。

2.查断点

info break :查看断点信息。(也可以简写成i b)

由此我们就可以看到它的断点个数、序号,Disp我们先不管,Enb表达的是它的使能,就是说这个断点是开启的状态(y)还是关闭的状态(n),后面的信息就是它的地址,还有在哪个文件.

3.去断点

delete breakpoints n:删除序号为n的断点(d 序号)

4.运行

我们在第十五行的时候打了一个断点,所以运行在第十五行的位置停了下来。

5.关闭断点

disable breakpoints:禁用断点

如图所示,我们保留了序号为二的断电且禁用了它。

6.启用断点

disable breakpoints:禁用断点

如图所示,使能又变回了y。

7.逐过程

n 或 next:单条执行。

我们在run运行后自动到了我们的断点位置,接下来我们输入n/next就可以逐过程调试了,由于Linux的gdb会自动记录上一次的指令,所以我们直接一直回车就可以了。

8.进入函数

s或step:进入函数调用

没遇到函数前我们还是继续n,到函数的时候我们输入s/step,就进入到我们的函数中了。

9.显示变量的值

p/print 变量:打印变量值。

如图所示,我们a,b加起来是2,所以我们的c=a+b就是2,$后面的数字表示查询了几次。

display 变量名:跟踪查看一个变量,每次停下来都显示它的值

undisplay:取消对先前设置的那些变量的跟踪

这里记住输入的不是变量名,而是它前面的序号。

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

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

相关文章

【Azure 架构师学习笔记】- Azure Databricks (10) -- UC 使用

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (9) – UC权限 在前面的文章:【Azure 架构师学习笔记】- Azure Databricks (6) - 配置Unity Catalog中演示了如何配置一个UC。 本文…

深度剖析Selenium与Scrapy的黄金组合:实现动态网页爬虫

在当今互联网时代,大量网站采用动态网页技术呈现信息,这给爬虫技术提出了新的挑战。本文将带您深入探讨如何应对动态网页的爬取难题,结合Python爬虫框架Scrapy和自动化测试工具Selenium进行实战,为您揭示动态网页爬取的技术奥秘。…

阿里巴巴中国站获得淘口令真实url API(1688.item_password)

阿里巴巴(1688.com)是一个B2B电商平台,而淘口令(或称为淘宝口令)是一种在阿里巴巴集团旗下的淘宝和天猫平台中分享商品或活动链接的特殊形式。淘口令通常包含一串字符,用户可以复制这串字符并在淘宝或天猫的…

ffmpeg深度学习滤镜

环境搭建 安装显卡驱动 当前所用显卡为NVIDIA的P6000,在英伟达的官网上查看对应的驱动, 下载NVIDIA-Linux-x86_64-535.104.05.run并安装。 sudo ./NVIDIA-Linux-x86_64-535.104.05.run 安装成功后用nvidia-smi命令后查看 安装的cuda版本不能超过12.2,选择安装cuda11.8。…

高并发Server的基石:reactor反应堆模式

业务开发同学只关心业务处理流程。但是我们开发的程序都是运行服务端server上,服务端server接收到IO请求后,是如何处理请求并最终进入业务流程的呢?这里不得不提到reactor反应堆模型。nginx tomcat redis nodejs dubbo等软件的网络处理模型都…

《Linux C编程实战》笔记:信号量

信号量在操作系统的书里一般都有介绍,这里就只写书上说的了。 信号量是一个计数器,常用于处理进程或线程的同步问题,特别是对临界资源访问的同步。临界资源可以简单地理解为在某一时刻只能由一个进程或线程进行操作的资源,这里的…

【ArcGIS】利用高程进行坡度分析

在ArcGIS中利用高程进行坡度分析 坡度ArcGIS实操参考 坡度 坡度是地表单元陡缓的程度,通常把坡面的垂直高度和水平距离的比值称为坡度。 坡度的表示方法有百分比法、度数法、密位法和分数法四种,其中以百分比法和度数法较为常用。 (1&#…

opencv-python保存视频为mp4格式并支持在浏览器播放

前言 之前在项目上使用yolov8进行视频检测的时候,yolov8默认windows系统下保存的是avi格式 suffix, fourcc (.mp4, avc1) if MACOS else (.avi, WMV2) if WINDOWS else (.avi, MJPG) self.vid_writer[idx] cv2.VideoWriter(str(Path(save_path).with_suffix(suf…

SpringBoot对于SpringMVC的支持

创建项目 版本说明这里使用的 SpringBoot 2.0.0.Release SpringBoot对于SpringMVC的支持 在之前的开发中很多场景下使用的是基于xml配置文件或者是Java配置类的方式来进行SpringMVC的配置。一般来讲,初始的步骤如下所示 1、初始化SpringMVC的DispatcherServlet2、…

Linux命令之ls命令

ls命令 ls命令的作用是列出目录下的内容,语法如下: ls [ -a -l -h ] [ Linux路径 ] 1、 -a -l -h 是可选的选项。 2、Linux路径是此命令可选的参数。 当不使用选项和参数,直接使用 ls 命令本体,表示:以平…

网工内推 | 网络安全工程师,软考认证优先,最高15K+绩效奖金

01 南京古田化工有限公司 招聘岗位:网络安全工程师 职责描述: 1. 负责公司日常网络与安全设备的实施、安装、运维、监控、巡检工作,如防火墙,交换机,路由器,VPN,WAF,IPS/IDS,抗DDOS,终端准入&a…

【Pytorch深度学习开发实践学习】B站刘二大人课程笔记整理lecture07多维输入

lecture07多维输入 课程网址 Pytorch深度学习实践 部分课件内容: import torch import numpy as npxy np.loadtxt(diabetes.csv.gz, delimiter,, dtypenp.float32) x_data torch.from_numpy(xy[:,:-1]) #第一列开始最后一列不要 y_data torch.from_numpy(…

读取7400MB/s!华为发布eKitStor Xtreme M.2闪存条

今日,华为举行数据存储新春新品发布会,不仅发布全新数据湖解决方案,华为还针对商业市场与分销市场发布了全闪存存储新品。 据介绍,面向游戏加速、影视编辑、户外作业等场景,华为发布eKitStor Xtreme系列高性能M.2闪存条…

IOS不使用默认的mainStroryboard作为首个controller的方法

步骤1: 删除info.plist文件下的一条配置,如图 步骤2: 编辑AppDelegate.m,参考以下代码 interface AppDelegate () //property (strong, nonatomic) UIWindow * window; property(nonatomic,strong) UIWindow * win; property(…

社区店发展趋势预测:未来哪些行业将崛起?

在当今的商业环境中,社区店作为一种贴近消费者生活的商业模式,具有很大的发展潜力。 作为一名社区开鲜奶吧5年的创业者,我将根据自己的经验和观察,预测未来哪些行业将在社区店中崛起。 一、健康与养生行业 随着人们健康意识的提…

函数栈帧的创建及销毁(超详解)

目录 1.预备知识 1.1内存区的划分 1.2认识相关寄存器和汇编指令 1.2.1寄存器 1.2.2相关汇编指令 2.测试前 2.1测试代码及环境 2.2 main函数也是被其他函数调用的 3.函数栈帧的创建 4.进入函数内部 5.形参与实参 6.call/jump add函数 7.函数栈帧的销毁 7.1保存…

【C++】C++入门篇,初识C++----第一个C++结构,C++关键字,命名空间,C++的输入输出,缺省参数【图文详解】

欢迎来CILMY23的博客喔,本篇为【C】C入门篇,初识C----第一个C结构,命名空间,C的输入输出,缺省参数【图文详解】,深刻理解命名空间,带大家入门C,感谢观看,支持的可以给个一…

灌水:powershell 练习正则表达式

亲爱的读者们&#xff0c;请展示你们的能力&#xff1a;解析&#xff08;使用代码&#xff09;解析以下字符串 <鱼龙混杂的奇葩文件#> UI1|System.Windows.Forms.linklabel #创建用户对象 1.location.250.250 1.text.磁盘清理 1.autosize #自适应大小 #存在混淆风险…

队列的基本操作——常见队列的对比分析(c语言完整代码包含注释)

目录 一、队列 1.1基本概念 1.2基本操作 1.3 队列分类 1.3.1带头队列 1.3.2不带头队列 1.3.3 循环带头队列 1.3.4 循环不带头队列 1.3.5 总结 二、代码实现 2.1带头队列 2.2不带头队列 2.3循环带头队列 2.4循环不带头队列 一、队列 1.1基本概念 队列&#xff08…

85、字符串操作的优化

上一节介绍了在模型的推理优化过程中,动态内存申请会带来额外的性能损失。 Python 语言在性能上之所以没有c++高效,有一部分原因就在于Python语言将内存的动态管理过程给封装起来了,我们作为 Python 语言的使用者是看不到这个过程的。 这一点有点类似于 c++ 标准库中的一些…