gdb 快速上手(附带测试案例)

news2024/9/24 19:15:59

在终端使用 gdb 对程序进行调试比较复杂,本文旨在帮助小白快速上手 gdb ,所以只介绍了一些比较重要的命令!

案例代码在文末!

一、gdb 调试

1、编译源文件

gcc -g test.c -o test

2、启动程序

gdb ./test

  结果如下:

说明:结果中出现:Reading symbols from ./test03... 即成功启动调试程序! 

 3、设置断点

  方式一:执行命令

b main           //在入口函数出设置一个断点

  方式二:执行命令

b .c文件路径:行数

//在test03.c文件的123行设置一个断点
b /root/sql_test/test03.c:123          

  结果如下:

4、查看断点

  执行命令:

info b             //查看断点情况及断点对应编号

  结果如下:

5、删除断点

  执行命令:

//删除指定编号(Num)的断点
d num1 num2…          

//删除1号断点
d 1        

  结果如下:

6、进入调试

  执行命令:

r              //进入调试,并到达第一个断点

  结果如下:

7、单步调试

  方式一:执行命令

n             //单步调试但不进入具体函数内部

  结果如下:

  说明:调试语法糖------直接回车会执行上一步调试操作;

  方式二:执行命令

s              //单步调试且进入具体函数内部

  结果如下: 

8、从一个断点跳到下一个断点

  执行命令:

c             //从一个断点跳到下一个断点

  结果如下: 

9、监视变量

  执行命令:

watch 变量名             //用于监视某个变量,一旦变量发生变化就会立即停止

  结果如下:

说明:监视某个变量前,尽量关闭所有断点。在使用GDB进行调试时,当你使用watch命令监视某个变量时,最好将断点关闭或删除。这是因为watch命令会在每次变量的值发生变化时触发断点,以便你能够捕捉到变量的变化。如果你在设置了断点的情况下使用watch命令,那么每当变量的值发生变化时,GDB会首先触发断点,然后再触发watch命令。这可能会导致调试过程中出现不必要的中断,使得调试变得困难。因此,为了更好地使用watch命令,建议在使用它之前关闭或删除断点。

10、查看变量

  执行命令:

p 变量名             //查看变量的值

  结果如下:

说明:通过上图可知,在查看变量i的值之前,设置了两个断点,分别为示例代码的第124、141行,第一个 p i 查看的是代码中全局变量i的定义值,第二个 p i 查看的是执行了第141行代码后i的值。 

11、查看源代码

  执行命令:

layout src             //弹出源码框且光标停留在第一个断点处,特别说明:快捷键Ctrl+X+A同样可以打开/关闭代码框

  结果如下:

说明:此时如果使用键盘上下翻滚键或者鼠标是无法将代码中的光标移至下一行的。正确做法:在命令行输入:n,即可将光标移至下一行,并通过语法糖(回车键)继续执行命令n。    

  结果如下: 

12、查看汇编代码

  执行命令:

layout asm            //打开汇编意义上的代码且光标停留在第一个断点处,特别说明:快捷键Ctrl+X+A同样可以打开/关闭代码框

  结果如下:

说明:此时如果使用键盘上下翻滚键或者鼠标是无法将代码中的光标移至下一行的。正确做法:在命令行输入:si,即可将光标移至下一行,并通过语法糖(回车键)继续执行命令si。

  结果如下:

13、从入口函数mian执行到断点,中间经历的函数

  执行命令:

bt            //从入口函数mian执行到断点,中间经历的函数(逆序看经历的函数)

  结果如下:

14、查看寄存器

  执行命令:

info r             //查看寄存器的值

  结果如下:

 15、结束当前程序

  执行命令:

k             //结束当前程序,但不会结束调试

  结果如下:

16、退出调试

  执行命令:

quit         //退出调试

  结果如下:

 二、测试代码

测试代码明天贴出!!! 

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

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

相关文章

Fortinet独揽OT领导者称号丨Westlands 《Navigator工业网络安全展望报告》发布

专注推动网络与安全融合的全球网络安全领导者Fortinet(NASDAQ: FTNT)近日宣布,业内领先的OT安全行业分析和战略公司Westlands Advisory(威士兰咨询,以下简称WA),在最新发布的《工业网络安全展望…

pandas|判断是否包含|contains|isin

文章目录 1. 方法简介1.1 pandas.Series.str.contains1.2 pandas.DataFrame.isin 2. 示例13. 示例24. 相关文章(1) pandas分组聚合|agg|transform|apply(2) 缺省值判断 pd.isnull, pd.isna, pd.notna, pd.notnull, np.isnan, math.isnan 区别(3) pandas中DataFrame字典互转(4) …

初识Java 4-1 初始化与清理

目录 通过构造器进行初始化 无参构造器 方法的重载 使用基本类型的重载 this关键字 在构造器中调用构造器 static的含义 成员初始化 初始化顺序 静态数据的初始化 显式的静态初始化(静态块) 非静态实例的初始化 数组初始化 动态数组的创建 …

kubernetes进阶 (一) 环境搭建

我是基于一台centos7.6的腾讯云主机进行操作的,配置为4C8G,之前的文档自己试着搭建发现有问题了,这里重新整理下笔记,集群版本选择1.22.2(一年前搭的)用的还不错 清理环境 之前我的环境可能装过docker或者什…

WIFI与BT的PCB布局布线注意事项

1、模块整体布局时,WIFI模组要尽量远离DDR、HDMI、USB、LCD电路以及喇叭等易干扰模块或连接座; 2、晶体电路布局需要优先考虑,布局时应与芯片在同一层并尽量靠近放置以避免打过孔,晶体走线尽可能的短,远离干扰源&…

【附安装包】EViews 12.0安装教程

---------------------------END--------------------------- 题外话 当下这个大数据时代不掌握一门编程语言怎么跟的上脚本呢?当下最火的编程语言Python前景一片光明!如果你也想跟上时代提升自己那么请看一下. 感兴趣的小伙伴,赠送全套Pyt…

Vue框架--理解MVVM

我们知道,MVVM是Model-View-ViewModel的简写。它本质上就是MVC的改进版。我们看看MVVM的模型架构,如下所示: 架构理解与实例

Matlab论文插图绘制模板第111期—带线标记的图

本期分享的是带线标记注释的图。 先来看一下成品效果: 特别提示:本期内容『数据代码』已上传资源群中,加群的朋友请自行下载。有需要的朋友可以关注同名公号【阿昆的科研日常】,后台回复关键词【绘图桶】查看加入方式。 模板中最…

Codeforces Harbour.Space Scholarship Contest 2023-2024 (Div. 1 + Div. 2)

解题情况 3of 9 A B C 日期 9.1 目录 A. Increasing and Decreasing 题目分析: 代码: B. Swap and Reverse 题目分析: 代码: C. Divisor Chain A. Increasing and Decreasing 题目分析: x->y递增&#xf…

keepalived 主备都存在vip, keepalived主备跨网段配置;keepalived主备服务器不在同一个网段怎么配置

keepalived 主备都有vip问题;主备服务器不在同一个网段怎么配置 主机:128.192.10.10 备机:128.192.11.11 备机:128.192.22.22 # keepalived的配置文件增加如下配置即可实现 # 主机:128.192.10.10 vrrp_instance VI_1 {…

【Latex】使用技能站:(三)使用 Vscode 配置 LaTeX

使用 Vscode 配置 LaTeX 引言1 安装texlive2 安装vscode2.1 插件安装2.2 配置 3 安装SumatraPdf3.1 vscode配置3.2 配置反向搜索 引言 安装texlive 安装vscode 安装SumatraPdf 1 安装texlive 在线LaTeX编辑器:https://www.overleaf.com TeX Live下载:h…

layui数据表格实现表格中嵌套表格,并且可以折叠展开

效果: 思路: 1、最外层的表格先渲染,在done回调中向每个tr后面插入一个用来嵌套子级表格的tr。 tr的class和table的id需要用索引 i 关联 //向每一行tr后面追加显示子table的trlet trEles $(".layui-table-view[lay-idlist] tbody tr&…

openGauss学习笔记-53 openGauss 高级特性-Ustore

文章目录 openGauss学习笔记-53 openGauss 高级特性-Ustore53.1 设计原理53.2 核心优势53.3 使用指导 openGauss学习笔记-53 openGauss 高级特性-Ustore Ustore 存储引擎,又名 In-place Update 存储引擎(原地更新),是 openGauss …

Vite打包性能优化及填坑

最近在使用 Vite4.0 构建一个中型前端项目的过程中,遇到了一些坑,也做了一些项目在构建生产环境时的优化,在这里做一个记录,以便后期查阅。(完整配置在后面) 上面是dist文件夹的截图,里面的内容已经有30mb了&#xff…

开学季ipad手写笔什么牌子好?第三方电容笔推荐

自从ipad之类的平板电脑上出现了电容笔,电容笔就成功的取代了我们的手指,大大加快了我们的写作速度。不过,由于苹果pencil自带的先进芯片,导致其售价一直很高,给很多人,特别是学生,造成了很大的…

Python(Web时代)—— Django操作现有数据库表

Mysql操作 前言 在实际开发过程中,我们经常会遇到数据库表已经建立好了,现在只需要开发项目功能,操作已有数据库表的情况。 Django为我们提供了inspecdb的方法。他的作用即是对已经存在的数据库表来反向映射结构到models.py中. 操作 第一…

前端监听SDK(上报埋点数据)

1、使用方式 <head><script>window.pineapple || (pineapple {});pineapple.param {"src": "http://127.0.0.1:3001/pa.gif","token": "dsadasd2323dsad23dsada",};</script><script src"js/pineapple.j…

sql各种注入案例

目录 1.报错注入七大常用函数 1)ST_LatFromGeoHash (mysql>5.7.x) 2)ST_LongFromGeoHash &#xff08;mysql>5.7.x&#xff09; 3)GTID (MySQL > 5.6.X - 显错<200) 3.1 GTID 3.2 函数详解 3.3 注入过程( payload ) 4)ST_Pointfromgeohash (mysql>5.…

如何截取视频中的一段视频?分享几种视频分割方法

当处理长视频时&#xff0c;视频分割可以使您更加高效。如果您只需要处理其中的一部分&#xff0c;而不是整个视频&#xff0c;那么分割视频可以使您更容易找到需要处理的部分。而且&#xff0c;分割视频还可以使您更容易在不同的项目之间重复使用视频片段。教大家几种简单的视…