【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.mzph.cn/news/727912.shtml

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

相关文章

【程序人生】探索2024年AI辅助研发趋势

目录标题 探索2024年AI辅助研发趋势一、AI在编码中的应用智能代码生成助力开发错误检测与修复的即时反馈性能优化的智能建议 二、AI驱动的自动化工具三、AI与团队协作四、未来展望结语 探索2024年AI辅助研发趋势 随着人工智能技术的迅速发展&#xff0c;AI在各个领域的应用正日…

虽说主业搞前端,看到如此漂亮的网页UI,也是挪不开眼呀。

漂亮的网页UI能够吸引人的眼球&#xff0c;给人留下深刻的印象。作为前端开发人员&#xff0c;可以通过不断学习和掌握设计技巧和工具&#xff0c;提升自己的UI设计能力&#xff0c;为用户提供更好的视觉体验。 以下是一些提升网页UI设计能力的建议&#xff1a; 学习设计基础知…

仿牛客网项目---消息队列的实现

本篇文章讲一讲我们的项目中用到的消息队列。 1.阻塞队列 2.kafka 我的项目为什么要用消息队列&#xff1f; 如果采用消息队列&#xff0c;那么评论、点赞、关注三类不同的事&#xff0c;可以定义三类不同的主题&#xff08;评论、点赞、关注&#xff09;&#xff0c;发生相应…

关于C/C++ riscv64、mipsel 平台标准库 std::atomic<T> 原子变量编译失败问题解决

RISCV64 适用 C/C STL 平台原子变量链接不上的问题&#xff0c;可以看下之前写的这篇文章。 RISC-V平台 std::atomic&#xff1c;T&#xff1e; 编译失败问题解决-CSDN博客 mipsel 平台上面也可以按照这个方式解决&#xff0c;在 mipsel 平台上面没法使用 8字节的STL原子变量&…

游戏盾如何应对微商城网站DDoS攻击

游戏盾如何应对微商城网站DDoS攻击&#xff1f;随着电子商务的快速发展&#xff0c;微商城网站已成为众多商家开展在线业务的重要平台。然而&#xff0c;与此同时&#xff0c;网络安全威胁也愈发严重。其中&#xff0c;分布式拒绝服务&#xff08;DDoS&#xff09;攻击是一种常…

AI Agents之CrewAI智能体开发框架

一、前言 AI Agents 的开发是当前软件创新领域的热点。随着大语言模型 (LLM) 的不断进步&#xff0c;预计 AI 智能体与现有软件系统的融合将出现爆发式增长。借助 AI 智能体&#xff0c;我们可以通过一些简单的语音或手势命令&#xff0c;就能完成以往需要手动操作应用程序才能…

性能测试之性能调优

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 性能测试是通过模拟实际使用场景&#xff0c;对系统进行压力测试…

leetocode1047.删除字符串中的所有相邻重复项

思想&#xff1a;使用栈来存储最近访问过的元素。string尾部就是栈顶&#xff0c;可访问最近访问过的字符&#xff0c;后入先出。具体思想直接参考 【栈的好戏还要继续&#xff01;| LeetCode&#xff1a;1047. 删除字符串中的所有相邻重复项】 string方法API&#xff0c;记住…

学习Android的第二十五天

目录 Android TextWatcher 范例 参考文档 Android 消息传递 - Handler Handler的工作机制 Handler 方法 范例 参考文档 Android AsyncTask 异步任务 什么是多线程 同步与异步 Android 为什么要引入异步任务 AsyncTask AsyncTask 方法与流程 范例 参考文档 Andr…

【华为OD机试】最多购买宝石数目【C卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述: 橱窗里有一排宝石,不同的宝石对应不同的价格, 宝石的价格标记为gems[i],0<=i<n, n = gems.length 宝石可同时出售0个或多个,如果同时出售多个,则要求出售的宝石编号连续; 例如…

片上网络(NoC)技术的发展及其给高端FPGA带来的优势

片上网络(NoC)技术的发展及其给高端FPGA带来的优势 1. 概述 在摩尔定律的推动下,集成电路工艺取得了高速发展,单位面积上的晶体管数量不断增加。 片上系统(System-on-Chip,SoC)具有集成度高、功耗低、成本低等优势,已经成为大规模集成电路系统设计的主流方向,解决了…

java017 - Java抽象类

1、概述 一般情况&#xff0c;动物是抽象的&#xff0c;所以不能被new,比如你在Animal类中定义一个成员方法eat,你不能定义具体内容&#xff0c;比如吃鱼或者吃白菜&#xff0c;因为动物是抽象的。 一个没有方法体的方法&#xff0c;应该定义为抽象方法&#xff0c;而类中如果…

I’m stuck!(CCF201312-5)解析(java实现)

代码 package test_201312;import java.util.Scanner;/** 201312-5 试题名称&#xff1a; I’m stuck! 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 问题描述给定一个R行C列的地图&#xff0c;地图的每一个方格可能是#, , -, |, ., S, T七…

Oracle控制文件control file(1)控制文件概述

导读 本文介绍Oracle数据库控制文件control file相关内容 1、控制文件概述 控制文件是数据库中非常重要的一类文件&#xff0c;它记录的当前实例连接的数据库的结构和行为&#xff0c;并维护数据库的一致性。 初始化参数文件中定义了控制文件的位置&#xff1b; 控制文件是很…

抖音短视频小程序发布招聘让招聘更简单!

抖音短视频小程序怎么发布招聘信息呢&#xff1f; 据2023年初统计&#xff0c;全国已有人力资源机构6.3万家&#xff0c;其中在抖音短视频平台发布的人力资源公司有1.9万家以上&#xff0c;全国有近几千家大型企业已经通过抖音平台进行岗位直招。 抖音目前已经成为短视频流量…

2024年最佳硬盘!为台式电脑、NAS等产品量身定做的顶级机械硬盘

机械硬盘&#xff08;HDD&#xff09;可能看起来像是古老的技术&#xff0c;但它们仍然在许多地方提供“足够好”的性能&#xff0c;并且它们很容易以同等的价格提供最多的存储空间。 尽管最好的SSD将为你的操作系统和引导驱动器提供最好的体验&#xff0c;并提供比HDD更好的应…

vite项目修改依赖不更新,清除依赖缓存

有些时候我们会直接修改依赖文件&#xff0c;但修改后没有更新&#xff0c;大多数情况下就是被缓存了 解决方法 1、手动删除node_modules/.vite Vite 会将预构建的依赖缓存到 node_modules/.vite;然后手动删除即可 2、强制vite重新构建依赖 用 --force 命令行选项启动开发服务…

JavaScript this对象

this关键字时是函数运行时自动生成的一个内部对象&#xff0c;只能在函数内部使用&#xff0c;总指向调用它的对象 绑定规则 默认绑定 全局环境中定义函数&#xff0c;内部使用this关键字 var name Jenny; function person() {return this.name; } console.log(person());…

C++项目--高并发内存池

目录 一、项目介绍二、内存池介绍2.1 池化技术2.2 内存池2.3 内存池主要解决的问题2.4 malloc 三、定长内存池的实现3.1 定长内存池概念3.2 内存池管理释放对象3.3 内存池申请对象3.4 定长内存池整体代码3.5 性能对比 四、高并发内存池整体框架设计4.1 该项目解决的问题4.2 整体…

C语言贪吃蛇实现,以及一些有趣的想法(可加速减速)

文章目录 每日一言代码&#xff1a;Snake.hSnake.ctest.c 可以增加游戏趣味性的想法结语 每日一言 结局每隔一段时间就会到来&#xff0c;我经历它&#xff0c;就像飞机穿过云层。 跟着课程敲了一下午&#xff0c;终于写好了~ 用到了一些没用过的函数&#xff0c;总结介绍一下…