【Linux】开始使用gdb吧!

在这里插入图片描述

开始使用gdb吧!

  • 1 下载安装
  • 2 开始使用
  • 3 实践运用
  • 补充一下 print 的 功能 (类似监视窗口的作用)和显示堆栈的功能
  • Thanks♪(・ω・)ノ谢谢阅读!!!
  • 下一篇文章见!!!

这篇文章我们来学习 gdb 的使用方法。我们在Windows端编写代码时有宇宙最强编译器VS2022帮助我们调试,那Linux端有没有一款强大的调试工具呢???
当然有了 它就是 gdb :
Linux下的gdb(GNU Debugger)是一款强大的调试工具,对于程序员来说,掌握gdb的使用技巧是开发过程中必不可少的技能。根据Statista的数据,截至2023,Linux在全球服务器操作系统市场占据近37%的份额,这使得gdb成为了许多专业人士必备的工具。
本文将介绍如何使用gdb。

1 下载安装

首先我们要确保已经安装gdb,可以通过 gdb -version来进行间接查看。
未安装使用sudo yum -y install gdb 下载安装即可。
在这里插入图片描述

2 开始使用

首先进入gdb直接使用:gdb 文件名
接下来我直接给出 gdb 的 所有功能命令(注意简写形式,会经常使用):

  1. list /l 行号:显示指定行号附近的源代码,每次显示10行,从当前光标位置向下滚动
  2. list /l 函数名:显示指定函数的完整源代码
  3. r 或 run:开始执行程序
  4. n 或 next:执行下一条语句,不会进入函数内部相当于 F10
  5. s 或 step:执行下一条语句,如果下一条语句是函数调用,则进入该函数内部相当于 F11
  6. break(b) 行号:在指定的行号设置断点。相当于 F9
  7. break 函数名:在指定函数的开头设置断点。
  8. info break:显示所有断点的信息
  9. finish:执行当前函数的剩余部分,直到函数返回,然后暂停程序。
  10. print ( p ) 表达式:计算并打印表达式的值。
  11. p 变量:打印变量的值
  12. set var:修改变量的值
  13. continue(或c):继续执行程序,直到下一个断点或程序结束相当于 F5
  14. run(或r):从程序的开始处执行程序,直到程序结束或遇到断点。

断点相关操作

  1. delete breakpoints:删除所有断点。
  2. delete breakpoints n:删除指定编号的断点。
  3. disable breakpoints:禁用所有断点。
  4. enable breakpoints:启用所有断点。
  5. ignore:忽略特定的断点。例如,ignore 1 main 会让断点1在主函数上失效
  6. info(或i) breakpoints:显示当前设置的所有断点。

监视相关操作

  1. display 变量名:跟踪指定变量的值,并在每次程序暂停时显示它。

  2. undisplay:取消对先前设置的变量的跟踪。

  3. until X行号:继续执行程序,直到达到指定的行号。

  4. breaktrace(或bt):显示程序的调用栈,包括所有函数的调用和参数。

  5. info(i) locals:显示当前函数栈帧中局部变量的值。

  6. quit:退出GDB。

3 实践运用

接下来我们在实践中加深对gdb的熟悉:
首先我们编写一段简单程序:

 1 #include<iostream>2 using namespace std;3 4 int main(){5   int i = 0;6   int j = 100;7 8   while(i < 100){9     int sum = i + j;10     i++;11     j -= 2;12   }13                                                                                                                                                                             14   for(int k = 0;k<10;k++){15     cout<<"hello bit"<<endl;16   }17 18 19   return 0;20 }

然后我们直接进入gdb
在这里插入图片描述
出乎意料的是 再使用list出现了报错(No symbol table is loaded. Use the “file” command.)!!!

这是因为 gdb操作的应该是编译后的文件
当编译时,未加 - g 选项,则进入gdb环境中执行命令会出现No symbol table is loaded. Use the “file” command.提示;
一定要进行gcc/g++ -g test.c -o test操作哦。
在这里插入图片描述
这样就好了:成功显示出我们代码
在这里插入图片描述
接下来我们打开监视,来看看每个变量的变化。我们先打上断点来进入主函数:
在这里插入图片描述在这里插入图片描述
然后逐个 display 展示即可:
在这里插入图片描述
然后调试(continue、step、next)就好,可以清楚看到每个变量的值
在这里插入图片描述
我们来试试断点的快速移动:
在这里插入图片描述
我们直接就跳出了正在进行的while循环,来到14行了。
其他指令就不进行探索了,熟悉使用就可以了。

补充一下 print 的 功能 (类似监视窗口的作用)和显示堆栈的功能

  1. print 表达式:简记为 p ,其中“表达式”可以是任何当前正在被测试程序的有效表达式,比如当前正在调试C语言的程序,那么“表达式”可以是任何C语言的有效表达式,包括数字,变量甚至是函数调用。
  2. print a:将显示整数 a 的值
  3. print ++a:将把 a 中的值加1,并显示出来
  4. print name:将显示字符串 name 的值
  5. print gdb_test(22):将以整数22作为参数调用 gdb_test() 函数
  6. print gdb_test(a):将以变量 a 作为参数调用 gdb_test() 函数
  7. watch 表达式:设置一个监视点,一旦被监视的“表达式”的值改变,gdb将强行终止正在被调试的程序。如: watch a
  8. whatis :查询变量或函数
  9. info function: 查询函数,扩展info locals: 显示当前堆栈页的所有变量

堆栈:

  1. where/bt :当前运行的堆栈列表;
  2. bt backtrace 显示当前调用堆栈
  3. up/down 改变堆栈显示的深度
  4. set args 参数:指定运行时的参数
  5. show args:查看设置好的参数
  6. info program: 来查看程序的是否在运行,进程号,被暂停的原因。

Thanks♪(・ω・)ノ谢谢阅读!!!

下一篇文章见!!!

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

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

相关文章

重学SpringBoot3-自动配置机制

重学SpringBoot3-自动配置机制 引言Spring Boot 自动配置原理示例&#xff1a;Spring Boot Web 自动配置深入理解总结相关阅读 引言 Spring Boot 的自动配置是其最强大的特性之一&#xff0c;它允许开发者通过最少的配置实现应用程序的快速开发和部署。这一切都得益于 Spring …

腾讯云哪款服务器最便宜划算?2024腾讯云服务器优惠价格表

腾讯云优惠活动2024新春采购节活动上线&#xff0c;云服务器价格已经出来了&#xff0c;云服务器61元一年起&#xff0c;配置和价格基本上和上个月没什么变化&#xff0c;但是新增了8888元代金券和会员续费优惠&#xff0c;腾讯云百科txybk.com整理腾讯云最新优惠活动云服务器配…

基于similarities的文本语义相似度计算和文本匹配搜索

similarities 实现了多种相似度计算、匹配搜索算法&#xff0c;支持文本、图像&#xff0c;python3开发。 安装 pip3 install torch # conda install pytorch pip3 install -U similarities或 git clone https://github.com/shibing624/similarities.git cd similarities py…

Stable Diffusion 模型分享:DucHaiten-AIart-SDXL(动漫、3D、逼真)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 这是一个丰富多彩的 SDXL 模型&#xff0c;可以绘制动漫、3D、科幻、真实等类型的图片。 …

仓储管理系统(WMS) 的研发历程-PRD撰写

题外话&#xff1a;PRD的展现形式有多种&#xff0c;有的人喜欢在axure上直接做产品描述&#xff0c;觉得word较为过时&#xff0c;有的人认为axure不专业&#xff0c;任何展现形式都无可厚非&#xff0c;重要的达到PRD的目的&#xff0c;PRD的目标是让团队知道需求实现细节&am…

LVS负载均衡群集之NAT与DR模式

一 集群和分布式 企业群集应用概述 群集的含义 Cluster&#xff0c;集群、群集 由多台主机构成&#xff0c;但对外只表现为一个整体&#xff0c;只提供一个访问入口(域名或IP地址)&#xff0c;相当于一台大型计算机。 问题&#xff1f; 互联网应用中&#xff0c;随着站点对…

python爬虫(2)

继上节 查看数组维数 可以使用数组的ndim属性 代码示例如下&#xff1a; import numpy as np c np.random.randint(1,9,5) print(c.ndim) 结果如下&#xff1a; 当然这些也可以结合前面的各种用法来使用 1、选取数组元素 &#xff08;1&#xff09;一维数组的元素…

Java引用传递及基本应用

在 Java 中&#xff0c;传递参数的方式主要有两种&#xff1a;值传递&#xff08;传递的是对象的引用值&#xff09;和引用传递。本教程将重点介绍 Java 中的引用传递以及其基本应用。 1. 引用传递概念 在 Java 中&#xff0c;所有的方法参数都是通过值传递的。对于对象类型的…

【数学建模】层次分析代码(python)

上一篇学习了层次分析的理论&#xff0c;今天用代码实现一下吧&#xff01; 判断矩阵的一致性检验 import numpy as np A np.array([[1,2,3,5],[1/2,1,1/2,2],[1/3,2,1,2],[1/5,1/2,1/2,1]]) n A.shape[0]#获取A的行 eig_val, eig_vecnp.linalg.eig(A)#计算方阵的特征值和特…

Java并发编程-实现多线程的四种方式

创建线程的四种方式 创建线程的四种方式包括使用继承 Thread 类、实现 Runnable 接口、使用 Callable 和 Future 接口以及利用线程池。每种方式都有其特定的优势和适用场景。通过继承 Thread 类或实现 Runnable 接口&#xff0c;可以定义线程要执行的任务&#xff0c;并通过调用…

【应用多元统计分析】--多元数据的描述和展示(R语言)

一元随机变量 我们用协方差来刻画两个变量的相关关系&#xff0c;这里指的是线性相关关系。 对于一元随机变量的可视化最简单的就是散点图&#xff0c;大致可以看出X和Y之间的相关关系。如果想更好的看X、Y之间的相关关系&#xff0c;可以画二维的散点图。 总结&#xff1a; 均…

HTML超详细简介

HTML是什么 超文本标记语言&#xff08;HyperText Mark-up Language &#xff09;用来设计网页的标记语言用该语言编写的文件&#xff0c;以 .html或 .htm为后缀由浏览器解释执行不区分大小写&#xff0c;建议小写 HTML标签 HTML用于描述功能的符号成为“标签”标签都封装在…