Linux环境下gdb程序调试

news2024/10/6 6:44:36

目录

    • gdb介绍
    • 进入gdb调试环境
    • 指令学习
      • l(list)指令
      • b(break)指令
      • info b指令
      • d指令
      • r(run)指令
      • n(next)指令
      • s(step)指令
      • c(continue)指令
      • bt(breaktrace)指令
      • finish指令
      • p(print)指令
      • display指令
      • undisplay指令
      • until指令
      • disable命令
      • enable命令

  • 这篇文章将会介绍gdb以及一些常用的gdb调试指令;

gdb介绍

gdb是linux中的调试器,由于linux是命令行式的操作,所以要进行调试也一定是以命令行的方式进行,相比于win下vs等IDE的调试使用起来操作比较繁琐,但是程序调试的思路都是大致的。

但是在某些开发场景并没有设计专门的IDE,这种情况下是没有办法用IDE进行调试的,这个时候只能使用gdb调试了。

俗话说一名合格的程序员,大部分的时间都是在debug调试,可见熟悉gdb调试是至关重要的了!


进入gdb调试环境

  1. 创建mytest.c的源文件,并写入如下代码用于调试;

在这里插入图片描述

编译及运行结果:

在这里插入图片描述

进入gdb环境进行调试:

  • 指令:gdb + 程序名称

在这里插入图片描述

但是再次版本下,我们发现输入gdb指令:l 0的时候,报错:

在这里插入图片描述

原因是默认情况下,我们在linux下使用gcc/g++默认生成的程序都是release版本,这种发布的版本是不带调试信息的,无法进行调试,是给用户使用的;

我们需要调试,就得编译的时候带选项-g告知编译器编译debug可调式版本的程序!
在这里插入图片描述

我们进一步观察能发现,release版本的成虚要比debug版本更小,因为优化,抹去了调试用的信息等:


指令学习

成功进入gdb调试环境并且能够调试了,我们介绍常用指令的学习

l(list)指令

l(list):显示出可执行程序内的代码,方便观察

在这里插入图片描述

当我们用l指令配合一个数字的时候:l + num表示从num行开始显示代码;

此时只能显示10行代码:,接着继续按回车,就能接着显示后续的10行代码;

在这里插入图片描述

当我们用l指令配合两个数字(用逗号隔开)的时候:l num1,num2表示显示从num1行到num2行的代码;
在这里插入图片描述

当我们使用l+函数名的时候:l addToVal 表示显示addToVal函数的代码,同样每次显示10行;

在这里插入图片描述

b(break)指令

b + 行数: 表示在指定行添加断点(breakpoint)

break+函数名: 进入指定函数,在其作用域内第一行有效代码设置断点

在第5行和第10行加断点:

在这里插入图片描述

在addToVal函数第一行代码处设置断点:

在这里插入图片描述

info b指令

info b: 显示出所有断点的信息

在这里插入图片描述

d指令

d + 断点编号:删除该编号的断点

在这里插入图片描述
d : 删除所有的断点

在这里插入图片描述

(注意,断点编号不是行号,d之前需要用info查一下断点的编号Num)

r(run)指令

l(list):程序运行指令,有断点运行到第一个断点处,无断点运行整个程序;

无断点的情况下运行完了整个程序:

在这里插入图片描述

运行到第一个断点处:
在这里插入图片描述

显示断点的编号以及中断位置所处的函数名当前文件名以及断点行号

n(next)指令

n(next) : 在程序已经run的基础上,逐过程执行,遇到函数调用不会进入直接执行完毕,类似VS中Debug调试的F10

在这里插入图片描述

s(step)指令

s(step) :在程序已经run的基础上, 逐语句执行,遇到函数可进入函数内部观察细节,类似VS中Debug调试的F11

在这里插入图片描述

c(continue)指令

c(continue) : 在程序已经run的基础上,从当前断点跳跃到下一个断点处,类似于VS中Debug调试的F5

在这里插入图片描述

在24行addToVal()函数入口处的断点处停下,用c指令,直接跳转到了26行的断点,期间的addToVal()和Print()函数都已被执行!

bt(breaktrace)指令

bt :查看各级函数调用的栈帧信息以及参数

在这里插入图片描述

finish指令

finish: 在某个函数内部时,不想再执行该函数,可以用finish直接结束函数,从而跳出该函数,1.之后回到这个函数的调用处,等待进一步的命令;2.得到这个函数的返回值;
在这里插入图片描述

p(print)指令

p(print)+变量名 : 打印当前栈帧内的变量的值

在这里插入图片描述
p(print)+(表达式) : 打印当前战阵括号内表达式的值

在这里插入图片描述

display指令

display 临时变量 : 跟踪一个变量,变量常驻在屏幕上,每次停下来都显示他的值;有点像VS的监视窗口中添加监视的变量;

在这里插入图片描述

undisplay指令

undisplay+临时变量编号 : 使其不再常驻在屏幕上 (与display配合使用,起相反作用)

在这里插入图片描述

until指令

until+行号 :直接跳至指定的有效代码行,一般用于直接跳出某个循环或递归

在这里插入图片描述

disable命令

diable+断点号 : 禁用指定的断点

在这里插入图片描述
disable b: 禁用所有断点

在这里插入图片描述

enable命令

启用断点,和上面disable用法一样,不再描述;

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

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

相关文章

3.移动端百分比布局练习-京东首页

访问地址 https://youthddup.gitee.io/myproject/ 1、项目目录结构 2、注意 (1)设置视口标签以及引入初始化样式 (2)二倍精灵图缩放 先把精灵图等比缩放原来的一半 然后再测精灵图位置 代码里background-size置为原来的一半 &a…

typescript 数组操作

使用变量来存储值会带来以下限制: 变量本质上是标量。换言之,一个变量声明变量声明一次只能包含一个。这意味着在程序中存储n个值需要n个变量声明。因此,当需要存储更大的值集合时,使用变量是不可行的。 程序中的变量以随机顺序分…

当下一场数字化的浪潮,正在各行各业深刻上演着

一场数字化的浪潮,正在各行各业深刻上演着。在零售领域,亦不例外。以往,提及零售,我们更多地想到的是,各式各样的电商平台,我们看到的是,各式各样的电商模式;现在,提及零…

测试用例设计-淘宝购物车

测试人员和开发人员产生争执了怎么办? ① 先检查自身,是否BUG描述不清楚 ② 站在用户的角度考虑问题 ③ BUG定级要有理有据 ④ 提高自身的技术能力和业务水平,最好同时提出解决方案。 ⑤ 开发人员不接受时,不要争吵,可…

YOLOv5更换骨干网络之 PP-LCNet

论文地址:https://arxiv.org/abs/2109.15099 代码地址:https://github.com/ngnquan/PP-LCNet 我们提出了一种基于MKLDNN加速策略的轻量级CPU网络,名为PP LCNet,它提高了轻量级模型在多个任务上的性能。本文列出了在延迟几乎不变的…

YOLOv5更换骨干网络之 EfficientNet-B0

论文地址:https://arxiv.org/abs/1905.11946 代码地址:https://githeb.com/TensorFlow/tpu/tree/master/Models/Offical/Efficientnet 卷积神经网络(ConvNet)通常是在固定的资源预算下开发的,如果有更多的资源可用,则…

如何从macOS ventura降级到 macOS Monterey?这两大方法可以帮到你

苹果发布了macOS 13 Ventura的正式版系统,增加了许多实用性的功能,大家纷纷下载更新最新版本的系统。但根据许多已安装ventura的用户反馈,这个版本的MacOS系统还不够成熟,应该有不少bug还没有修复过来,从而求助小编分享…

c#入门-泛型约束

泛型约束 使用泛型时会假设泛型占位符是任何类型。 但因为它被假设是任何类型,所以使用起来有很大的限制。只有所有类型都有的功能,他才能用。 为了满足所有的可能类型,可用的操作非常少。 为此我们可以为泛型占位符添加约束。虽然会让能兼…

大型项目迭代流程

一、回顾目标 总目标: 年底上线完成100% 结果: 年底上线并开量验证过成功,完成率100% 阶段目标A: 10月底项目全流程开发完成,并提测出票前流程 结果:10月21日项目开发完成100%,10月25日前…

基于残差神经网络的交通标志识别算法研究与应用实现

问题: 从图像中识别交通标志对于自动驾驶至关重要。要想实现自动驾驶,车辆必须了解并遵守所有交通规则。当前,特斯拉、谷歌、梅赛德斯-奔驰、丰田、福特、奥迪等许多大公司都在研究自动驾驶。因此,为了实现这项技术的准确性&…

pandas的series创建和pandans的dataFrame创建

一:series和读取外部数据 1.1pandas的series的了解 1.1.1 为什么要学习pandas numpy能够帮我们处理处理数值型数据,但是这还不够。很多时候,我们的数据除了数值之外,还有字符串,还有时间序列等 比如:我们通…

显式利用用户画像的多兴趣建模

显式利用用户画像的多兴趣建模 目前在多兴趣建模中,用户侧的特征包括用户基础画像特征(年龄、性别、地域等)、用户在当前场景的静态兴趣画像特征(短期兴趣画像、长期兴趣画像)、交互的历史正向行为序列特征&#xff0…

【Javassist】快速入门系列13 使用Javassist获取注解

系列文章目录 01 在方法体的开头或结尾插入代码 02 使用Javassist实现方法执行时间统计 03 使用Javassist实现方法异常处理 04 使用Javassist更改整个方法体 05 当有指定方法调用时替换方法调用的内容 06 当有构造方法调用时替换方法调用的内容 07 当检测到字段被访问时使用语…

MySQL性能优化三 一条SQL在MySQL中执行的过程

一 MySQL的内部组件结构 大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。 1.1 service层 主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学…

Easy-Captcha验证码 生成以及校验(简单易懂)

目录说明pom引入详解参数类使用easy-captcha 中提供了下面几种类源码说明Captcha使用验证图解源码测试GitHub说明 Java图形验证码&#xff0c;支持gif、中文、算术等类型&#xff0c;可用于Java Web、JavaSE等项目 pom引入 <dependency><groupId>com.github.whvc…

【C++】 bitset(位图)的使用

目录 一、bitset的基本介绍 1. 位图的概念 2. 位图的应用 二、biset的基本使用 1. bitset的成员函数 2. 基本使用介绍 1. 定义方式 2. 成员函数的使用 一、bitset的基本介绍 1. 位图的概念 所谓位图&#xff0c;就是用每一位来存放某种状态&#xff0c;适用于海量数…

win系统一台电脑安装两个不同版本的mysql教程

1.mysql下载zip包&#xff08;地址&#xff09;MySQL :: Download MySQL Community Serverhttps://dev.mysql.com/downloads/mysql/ 2.解压在你的电脑上&#xff08;不要再C盘和带中文的路径&#xff09; data和my.ini是没有的。 3.创建my.ini文件 创建记事本改变后缀名就可以 …

【5G RRC】小区搜索(Cell Search)和系统捕获(System Acquisition)流程

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

环境变量?拿来把你!

文章目录环境变量直接运行程序的第一种方法&#xff1a;把程序移动到系统目录底下echo $环境变量&#xff1a;查看环境变量PATH:指定命令的搜索路径export 定义一个新的环境变量export PATH旧路径&#xff1a;新路径getenv&#xff1a;获取环境变量—获取环境变量的第一种方式s…

车载诊断协议UDS——读写服务Service 22/2E

在UDS协议中,对于服务常用有两种格式: 1、Service (服务) + Subfunction( 子服务) 子服务可理解为对服务的功能补充,比如会话模式Service 10服务,子服务可以分为不同的会话模式(默认会话模式、扩展会话模式、编程会话模式等等),用来区分服务的执行权限。 2、Servi…