【lesson8】gdb的介绍及使用

2023-09-21 12:49:26

gdb的介绍

什么是gdb?

gdb是linux下的一款调试工具,当代码出现问题时可以用linux调试。

背景认识

我们都知道,程序的发行版本有两种:Debug和Release。
Debug版本的可以被调试,release版本的不能调试。
Linux下gcc和g++默认形成的可执行程序是release版本的

gdb的使用

gcc/g++ 程序文件名 -o 将来生成的可执行程序名 -g

功能:生成可调试文件

gdb调试命令

gdb 可执行程序名

功能:进入调试模式
在这里插入图片描述

quit

功能:退出gdb调试模式
在这里插入图片描述

list

功能:显示代码
在这里插入图片描述
list指令显示的代码是倒序的我们不易查看,下面还有别的指令。

l 0

功能:显示代码
在这里插入图片描述

Enter

功能:gdb会记录最近一条命令,如果命令无变化,回车还是执行记录的那条命令。
在这里插入图片描述
我们第一次使用l 0显示出红色框的少部分代码,为了代码全显示出来我按了两次Enter键才把代码完全显示出来。

r(run)

功能:开始调试,如果代码没有设置任何断点,程序就会直接运行结束
在这里插入图片描述
我们可以看到没有任何停顿,直接输出结果。

b(breakpoint) + n(行号)

功能:在第n行设置断点
在这里插入图片描述

info b

功能:查看断点信息
在这里插入图片描述

d(delete) + 断点编号

功能:删除断点
在这里插入图片描述
在这里插入图片描述

n(next)

功能:逐过程调试代码,相当于vs中的F10
在这里插入图片描述

在这里插入图片描述

p(printf) + 变量名

功能:打印变量内容
在这里插入图片描述

s(step)

功能:逐语句调试代码,相当于vs中的F11
在这里插入图片描述
我们可以看到当遇到函数是,s可以直接进入函数内部。

bt

功能:查看当前调用堆栈
在这里插入图片描述

finish

功能:将当前函数跑完就停下来
在这里插入图片描述
我们这里可以看到确实,finish跑完函数就停下来了。

display

功能:常显示
我们之前调试的时候,查看变量信息一直要我们手动的p,那么有没有一种方法可以我们不用每一步都自己手动的p呢?有,就是display
在这里插入图片描述
我们可以看到display后,下面的每次n都会出现要display的数据。

undisplay + 编号

功能:取消常显示
上面我们学到了常显示,那么怎么取消呢?就用undisplay
在这里插入图片描述
在这里插入图片描述
我们可以看到,确实取消了常显示。

until + n(行号)

功能:直接跳转到第n行(如果已经进入函数了,不能直接从函数里面跳转到外面的任何一行,只能执行完本函数,并且停下来)
在这里插入图片描述

c(continue)

功能:跳转到下一个断点
在这里插入图片描述

disable + 断点编号

功能:关闭断点,但不删除
在这里插入图片描述
在这里插入图片描述
我们这里也可以看到,当run的时候,是停在19 行编号断点处,而之前的17行编号1的断点确实被关闭了。

enable

功能:打开断点
在这里插入图片描述

在这里插入图片描述
我们可以看到这次就停在了17行的的编号1断点处

set var

功能:更改变量值
在这里插入图片描述
我们看到res的值确实被我们手动更改了。

gdb测试代码

  1 #include<stdio.h>
  2 
  3 int AddToTop(int top)
  4 {
  5   int res = 0;
  6   int i = 0;
  7   for(i = 0; i < top; i++)
  8   {
  9     res += i;
 10   }
 11   return res;
 12 
 13 
 14 }
 15 int main()
 16 {
 17   int top = 100;
 18   int res = 0;
 19   res = AddToTop(top);
 20   printf("%d\n",res);                                                                                                                               
 21   return 0;
 22 }
~

更多推荐

leetcode 54. 螺旋矩阵

1.题解如果一条边从头遍历到底,则下一条边遍历的起点随之变化选择不遍历到底,可以减小横向、竖向遍历之间的影响一轮迭代结束时,4条边的两端同时收窄1一轮迭代所做的事情变得很清晰:遍历一个“圈”,遍历的范围收缩为内圈一层层向里处理,按顺时针依次遍历:上、右、下、左。不再形成“环”了,就会剩下:一行或一列,然后单独判断矩阵不

计算机竞赛 机器视觉opencv答题卡识别系统

0前言🔥优质竞赛项目系列,今天要分享的是🚩答题卡识别系统-opencvpython图像识别该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!🥇学长这里给一个题目综合评分(每项满分5分)难度系数:3分工作量:3分创新点:3分🧿更多资料,项目分享:https://gitee.com/dancheng-senior

Vue路由及Node.js环境搭建

目录一.Vue路由1.1定义1.2应用领域1.3代码展示二、Node.js2.1定义2.2特点三.Node.js安装与配置好啦今天到这了,希望帮到你!!!一.Vue路由1.1定义Vue路由是指使用VueRouter插件来管理前端应用程序的导航和页面路由的过程。它允许你在单页面应用程序(SPA)中定义不同的路由路径,并将

JVM相关知识

运行程序时JVM中内存区域的划分:线程私有:本地方法栈:本地方法栈与虚拟机栈相似,区别是,本地方法栈为虚拟机使用的本地方法服务,虚拟机栈为虚拟机使用的JAVA方法服务。虚拟机栈:虚拟机栈中保存的主要是一个个栈帧,每当有一个方法被调用时,都会有栈帧入栈,方法结束时,栈帧就会被弹出,每个栈帧由局部变量表和操作数栈,动态连接

计算机毕业设计 基于SSM的电影推荐系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌🍅文末获取源码联系🍅👇🏻精彩专栏推荐订阅👇🏻不然下次找不到哟————————————————计算机毕业设计题目《10

亚运之城:杭州的搞钱之王 首富都得靠边站

作者:积溪简评:这届亚运会,杭州成了显眼包,也卷成了蚊香,这背后杭州的搞钱实力,究竟有多牛?#杭州亚运会#马云#阿里手机可以“打”公交10分钟就能到还只要1块钱?这届亚运会杭州的宝子们真成了“显眼包”杭州也卷成了蚊香钱塘江边的灯光秀玉皇大帝睡觉都得戴眼罩路边的椅子能充电垃圾桶穿上新外套就连“美男计”都不放过地铁口人均1

软考 -- 计算机学习(2)

文章目录一、安全性知识1.1信息安全和信息系统安全1.2信息安全技术1.3网络安全技术二、多媒体技术三、软件工程基础知识3.1信息系统生命周期3.2软件过程模型3.3信息系统开发方法3.4系统分析和设计概述3.5结构化开发方法3.6系统运行与维护四、项目管理4.1进度管理4.2质量管理4.3风险管理一、安全性知识1.1

OpenText EnCase 客户案例——诺贝丽斯(Novelis)

OpenTextEnCase客户案例——诺贝丽斯(Novelis)诺贝丽斯(世界领先的铝材压延和回收企业)通过OpenText保存数据和节省资金诺贝丽斯在内部引入电子发现,通过OpenTextEnCaseInformationAssurance(以前称为EnCaseeDiscovery)解决方案交付复杂的案例。挑战电子

MySQL常见面试题(四)

😀前言在进行数据库设计和优化的过程中,我们不得不面对多样化的技术和方法来确保我们的系统可以高效、可靠地运行。为了深入了解和掌握这个领域,我们将讨论InnoDB存储引擎的多种索引类型,以及索引的不同方面和分类。我们还将深入探讨为什么通常推荐使用自增列作为主键,以及主键和唯一键之间的区别。最后,我们将提供一系列可用于SQ

activiti流程变量

activiti流程变量定义流程变量在Activiti中是一个十分重要的角色,流程运转时,需要靠流程变量,业务系统和activiti结合时少不了流程变量,流程变量就是activiti在管理工作流时根据管理需要而设置的变量。比如:在出差申请流程流转是如果出差天数大于三天则需要总经理审批,否者只需要认识审批,出差天数就可以

AI&DAO,将会引领我们走向何方?

人工智能(AI)和分布式自治组织(DAO)都是区块链赛道的热门项目之一,他们看似在不同的领域独立发展,然而,它们之间也存在着巨大的协同潜力。未来,AI有望成为推动DAO发展的重要动力,同时,DAO也可成为AI的最佳实验场所。DAO的下一波浪潮可能是AIDAO。释放生产力的未来首先,让我们来思考一下,AI如何在DAO中释

热文推荐