GDB:从零开始入门GDB

目录

        1.前言

        2.开启项目报错

        3.GDB的进入和退出

        4.GDB调试中查看代码和切换文件

        5.GDB调试中程序的启动和main函数传参

        6.GDB中断点相关的操作

        7.GDB中的调试输出指令

        8.GDB中自动输出值指令

        9.GDB中的调试指令


前言

        在日常开发中,调试是我们必不可少的技能。在专业的编译器中,如VSCode,VS等编译器中都提供了较为完全的调试功能,如单步调试,异步调试等等。而在Linux中我们可以使用GDB工具来调试自己编写的代码,本篇文章就皆在讲解GDB的使用以及调试方法


开启项目报错

        在关于《MinGW:从入门到链接库》的文章中,曾对如何开启代码调试,关闭调试进行简单的讲解,在对GDB调试工具讲解之前,先简单回顾以下这些内容

        1.使用-W命令开启编译生成期间的警告

//开启编译生成期间的警告
g++ -o 可执行文件名 -W 源文件.cpp

图1.使用-W命令开启警告

        2.使用-Wall命令开启编译生成期间的所有警告

//开启编译生成期间的所有警告
g++ -o 可执行文件名 -Wall 源文件.cpp

图2.使用-Wall命令开启警告

        3.使用-Wunused-variable命令开启指定的Wunuser-variable警告和默认警告(其他指定的警告也可以通过修改-Wunused-variable的类型来修改)

//开启指定的wunuser-variable警告和默认警告
g++ -o 可执行文件名 -Wunused-variable 源文件.cpp

图3.使用-Wunused-variable命令开启默认警告和指定警告

        4.使用-Wno命令关闭编译期间的指定警告

//关闭指定的return-local-addr警告和默认警告
g++ -o 可执行文件名 -Wno-return-local-addr 源文件.cpp

图4.使用-Wno命令关闭指定的return-local-addr警告

        5.使用Werroe命令将编译生成期间的警告当作错误提示

//使用Werroe命令将编译生成期间的警告当作错误提示
g++ -o 生成的可执行文件名 -Werror 源文件.cpp

图5.使用-Werror命令将编译生成期间的警告当作错误提示

        6.使用-O命令(大写)设置文件优化等级其中优化等级共分为3个,优先级从1到3

//在编译生成期间对文件进行优化,优化等级为1
g++ -o 可执行文件名 -O1 源文件.cpp//在编译生成期间对文件进行优化,优化等级为2
g++ -o 可执行文件名 -O2 源文件.cpp//在编译生成期间对文件进行优化,优化等级为3
g++ -o 可执行文件名 -O3 源文件.cpp

图6.对编译源文件进行等级为1的优化


GDB的进入和退出

        在启动GDB调试之前,需要先对项目进行编译生成可执行文件。此时为了能进入GDB调试,在编译器CPP文件时需要加入-g命令,为生成的可执行文件添加调试信息,具体代码如下:

g++ -g -o 可执行文件名 要编译文件示例:g++ -g -o Demo2 txt1.cpp

图7.使用-g命令生成的可执行文件区别

        生成可执行文件后,可以使用gdb命令进入调试界面,如下:

gdb 可执行文件名示例:gdb Demo

图8.使用gdb命令进入GDB调试

        在进入GDB调试后,可以使用quit命令退出GDB调试,如下:

quit

图9.退出GDB调试


GDB调试中查看代码和切换文件

        在正式启动可执行文件前,我们一般需要先查看程序代码,找到合适的地方打断点,以下是几种查看代码和切换文件的方式:

                1.使用list命令查看当前调试的文件(默认显示前10行)

list
list 指定的文件名:行号
list 指定的文件名:函数名示例:list main:5  //查看main文件中的第五行(显示上下文代码)
示例:l main:fun   //仓库main文件中的fun函数
PS:也可以使用缩写l

    

图10.使用list命令查看代码

                2.使用set listsize命令设置默认显示的行数

set listsize示例 set listsize 20
PS:可简写为set list

                3.使用show listsize命令显示当前的显示行数

show listsizePS:可简写为 show list

图11.显示和设置的显示的行数

                4.使用fram命令查看当前显示代码的位置(可防止频繁调用list查看代码显示范围越界):

fram

图12.查看当前显示的行数


GDB调试中程序的启动和main函数传参

        在使用gdb命令进入GDB调试后,可以使用以下两种方式启动程序:

                1.使用run命令启动程序(执行到断点位置,无断点则全部执行):

run

图13.使用run命令启动程序

                2.使用start命令启动程序(执行到程序的第一行代码):

stars

图14.使用start命令启动程序

        一般我们在调试可执行文件时,需要传入参数,而且main函数也自带两个参数分别是int型的argc对象和char*型的argv对象,我们可以使用以下命令对其传参和显示当前传入参数:

                1.使用set args命令传入参数

set args 传入的参数示例:sey args 1 2 3

                2.使用show args命令显示当前传入的参数

show args

图15.设置参数和显示参数


GDB中断点相关的操作

        断点的类型分为两种,一个是条件断点,即满足指定条件则在该断点处停止,二是常规断点,程序运行到该位置便停止。在GDB中可以将断点设置到具体的行中,也可以设置到具体的函数中,具体参考如下:

                1.使用break命令设置断点

break 行数(函数名)示例: break 10
示例: b fun
PS:可使用简写b

图16.设置断点

                2.使用break命令设置条件断点

break 行数 if 条件示例:break 5 if i == 2

                3.使用break命令设置其他文件的断点

break 文件名:行数(函数名)示例:break main:5

        设置完断点后,可以取消设置的断点以及查看当前调试的断点信息,具体操作如下:

                1.使用info break命令查看断点信息

info breakPS:可简写为i b

图17.查看断点信息

                2.使用delete命令删除断点

delete 断点编号示例:delete 1
PS:可简写为d

                

图18.删除指定断点

                3.使用disable命令设置断点的状态为无效

disable 断点编号示例:disable 1    //设置编号为1的无效
示例:disable 1-3  //设置编号为1到3的无效
PS:可简写为dis

图19.使用disable命令设置断点状态为无效

                4.使用enable命令设置断点状态为有效

enable 断点编号示例:enable 1    //设置编号为1的断点生效
示例:enable 1-3  //设置编号为1到3的生效
PS:可简写为ena

图20.使用enable命令设置断点状态为有效


GDB中的调试输出指令

        在GDB中我们可以使用run和start指令来启动程序,当遇到断点时会停止,继续输入run或者start指令,则会提示我们是否要重新执行该程序。如果要继续执行则要使用continue指令,具体如下:

        1.使用continue指令继续运行程序

continuePS:可简写为c

图21.使用continue命令继续执行程序

        在调试过程中,我们在代码中也可能会经常使用printf或者cout函数来输出代码中执行的变量信息,这样能实时的观察到变量值的变化,方便我们定位代码的Bug。而在GDB中我们也可以做类似的操作,具体如下:

        1.使用print指令输出指定变量的值

                在使用print指令输出变量的值的时候,我们可以使用格式化字符限制输出的字符格式,类似于C语言中的scanf函数,具体格式化字符信息如下:

格式化字符备注
/x以十六进制的形式打印出整数
/o 以八进制的形式打印出整数
/t 以二进制的形式打印出整数
/f 以浮点数的形式打印变量或表达式的值
/c 以字符形式打印变量或表达式的值
/d 以有符号、十进制的形式打印出整数
/u 以无符号、十进制的形式打印出整数

表1.格式化字符表

        在使用print命令前,需要先给程序打上断点,并且使用run或start指令启动程序,当运行到断点时,即可使用print指令查看对象的值

print 变量名
print 格式化字符 变量名示例:print obj
示例:p /x obj
PS:可简写为p

图22.使用print命令输出指定对象的值

        2.使用ptype命令输出指定的变量的类型

ptype 变量名示例:ptype obj 

图23.使用ptype命令输出指定对象的类型


GDB中自动输出值指令

        在GDB调试中,我们会经常遇到循环,为了方便输出循环中的值,我们可以使用print指令输出,但是每一次执行后都执行一遍print指令则会十分麻烦。这时我们可以display指令自动输出指定变量的值,具体如下:

         1.使用display命令自动输出指定变量的值

                使用display命令输出变量的值,也可以使用格式化字符输出,具体可参考print指令的格式化字符表(表1),具体操作如下:

display 变量名
display 格式化字符示例:display obj

图24.使用display命令自动输出指定对象的值

        2.使用info命令输出自动显示表(使用display指令指定输出过的对象的值):

info display

图25.使用info命令输出自动显示表

        3.使用undisplay指令删除指定变量的自动输出

undisplay 变量编号示例:undisplay 1

        4.使用disable指令将自动输出变量的状态设为禁用

disable 变量编号示例:disble 1

        5.使用enable指令将自动输出变量的状态设为启用

enable 变量编号示例:enable 1

PS:具体可以参考断点中相关的操作


GDB中的调试指令

        我们在使用各种编译器进行调试时,会提供一些类似于单步调试等功能,而GDB也同样支持这些功能,具体如下:

        1.使用step命令执行下一行代码(当遇到函数时,将跳转至函数体内):

stepPS:可简写为s

        2.使用finish命令跳出函数体(使用step命令执行到函数体内部时,使用该指令跳出函数体。PS:保证函数体内不存在断点,若存在断点则还是执行该函数体内的代码):

finsh

        3.使用next命令执行下一行代码(当遇到函数时,不会跳转至函数体内):

nextPS:可简写为n

        4.使用unit跳出循环体(当断点在循环内时,可以使用该指令):

unit

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

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

相关文章

408数据结构-图的遍历 自学知识点整理

前置知识:图的存储与基本操作 图的遍历是指从图的某一顶点出发,按照某种搜索方法沿着图中的边对图中的所有顶点访问一次,且仅访问一次。因为树是一种特殊的图,所以树的遍历实际上也可以视为一种特殊的图的遍历。图的遍历算法是求解…

利用鱼骨图进行项目问题复盘与改进

一、引言 在项目管理中,问题复盘是一个至关重要的环节。它不仅能帮助我们识别项目执行过程中出现的问题,还能促使我们深入探究问题的根本原因,从而采取有效的改进措施。在这个过程中,鱼骨图作为一种强大的工具,为我们…

MEMS:Lecture 16 Gyros

陀螺仪原理 A classic spinning gyroscope measures the rotation rate by utilizing the conservation of angular momentum. 经典旋转陀螺仪通过利用角动量守恒来测量旋转速率。 Coriolis Effect and Coriolis Force 科里奥利效应是一种出现在旋转参考系中的现象。它描述了…

Internet Download Manager ( 极速下载器 ) 序列号注册码 IDM下载器注册机中文激活破解版

IDM下载器(Internet Download Manager)是一款专业的下载管理软件,它通过多线程技术和智能文件分段技术,有效提升下载速度,并支持断点续传,还具有计划下载功能,用户可以设置特定的下载时间,非常适合需要在特…

代码随想录算法训练营刷题复习1 :动态规划背包问题 01背包+完全背包

动态规划刷题复习 一、01背包 416. 分割等和子集1049. 最后一块石头的重量 II494. 目标和474. 一和零 416. 分割等和子集 class Solution { public:bool canPartition(vector<int>& nums) {int sum0;for(int i0;i<nums.size();i) {sumnums[i];}if(sum%2!0)retu…

IP地址、子网掩码、网段、网关

前面相同就是在同一个网段 如果子网掩码和网络号相与的结果是一样的&#xff0c;那么他们就在同一个子网 IP地址、子网掩码、网络号、主机号、网络地址、主机地址以及ip段/数字-如192.168.0.1/24是什么意思?_掩码248可以用几个ip-CSDN博客

谷歌上架,APP被移除了,没封号,换个包名还能重新提审上架?

对于在Google Play上架应用的开发者来说&#xff0c;尤其是那些矩阵式上架马甲包的开发者&#xff0c;可能已经遭遇过无数次应用被暂停或移除的情况了。通常这种情况下&#xff0c;账号也随之会被封&#xff0c;且大多数开发者认为&#xff0c;没有立马收到封号邮件的话&#x…

基于scikit-learn的机器学习分类任务实践——集成学习

一、传统机器学习分类流程与经典思想算法简述 传统机器学习是指&#xff0c;利用线性代数、数理统计与优化算法等数学方式从设计获取的数据集中构建预测学习器&#xff0c;进而对未知数据分类或回归。其主要流程大致可分为七个部分&#xff0c;依次为设计获取数据特征集&#x…

【C++】stack、queue和deque的使用

&#x1f497;个人主页&#x1f497; ⭐个人专栏——C学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读 一、stack 1. stack介绍 2. stack使用 二、queue 1. queue介绍 2. queue使用 三、deque 1. deque介绍 2. deque的…

【Pandas驯化-01】一文介绍 Pandas中的Dataframe和Series 区别

【Pandas】驯化-01一文介绍 Pandas中的Dataframe和Series 区别 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 相关内容文档获取 微信公众…

第九届星华杯网络邀请赛

T1喵星人的身高 T2犇犇碑 T3嘤嘤词典 T4三角区间和

简单Mesh多线程合并,使用什么库性能更高

1&#xff09;简单Mesh多线程合并&#xff0c;使用什么库性能更高 2&#xff09;Unity Semaphore.WaitForSignal耗时高 3&#xff09;VS编辑的C#代码注释的中文部分乱码 4&#xff09;变量IntPtr m_cachePtr切换线程后变空 这是第389篇UWA技术知识分享的推送&#xff0c;精选了…

HBase中Master初始化错误~

ERROR&#xff1a;org.apache.hadoop.hbase.PleaseHoldException:Master is initializing 1、停止HBase运行 2、启动zookeeper中的zkCli.sh服务 ./zookeeper/bin/zkCli.sh 3、执行完毕显示以下结果,删除habse文件夹 4、重新启动HBase即可。

python-02

面向对象 Python中把具有相同属性和方法的对象归为一个类。 class ClassName: 语句 class Myclass: # 定义类Myclassdef pp(self): # 定义方法pp()print("这是产品说明书")myclass Myclass() # 实例化类Myclass myclass.pp() # 调用Myclass中的方法pp()打印…

《幻影大师:透视缠中说禅的虚像与真相》

而且他从不犯错&#xff0c;至少在他的叙述中是这样&#xff0c;所有的文章和言论都被粉饰得完美无瑕&#xff0c;即便有误&#xff0c;他也绝不公开承认&#xff0c;更别提什么真诚的道歉和改正了。那些对他推崇备至的人&#xff0c;多是盲目追随&#xff0c;将他神化为无所不…

《Nest系列 - 1. 运行一个Nest项目以及整体目录学习》

初识Nest心路历程 作为一名前端开发&#xff0c;说实话&#xff0c;学习Nest后端技术, 会有一定的成本。我试着阅读文档&#xff0c;安装项目&#xff0c;把项目跑起来&#xff0c; 当我看到久违的Hellow world 后&#xff0c;还来不及欣喜&#xff0c;就困惑了, 作为一个后端…

Java的集合框架总结

Map接口和Collection接口是所有集合框架的父接口&#xff1a; Collection接口的子接口包括&#xff1a;Set接口和List接口 Map接口的实现类主要有&#xff1a;HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等 Set接口的实现类主要有&#xff1a;HashSet、Tr…

大数据实训项目(小麦种子)-03、大数据环境Hadoop、Mapreduce、Hive、Hbase、HDFS搭建服务及调试

文章目录 前言一、Linux系统Centos7安装配置JDK8二、Linxu系统Centos7中搭建Hadoop3.1.0服务下载地址服务1&#xff1a;详细步骤&#xff08;初始化与启动dfs服务&#xff09;详细步骤配置环境变量 服务2&#xff1a;Hadoop(YARN)环境搭建 三、Linux系统搭建Hive3.1.2服务前提条…

记录AE快捷键(持续补充中。。。)

记录AE快捷键 快捷键常用快捷键图层快捷键工具栏图层与属性常用指令视图菜单时间轴常规快捷键项目首选项功能摄像机操作 常用操作导入AI/PS工程文件加选一个关键参数快速回到上下一帧隐藏/显示图层关键帧拉长缩短关键帧按着鼠标左键不松手&#xff0c;在秒表那一列往下移动会都…

深度学习(PyTorch)批注理解,建议边学可以边看这个笔记

前言 动手学习深度学习&#xff0c;内容丰富&#xff0c;但是对于初学者有很多晦涩难懂的地方&#xff0c;我将日常更新这篇文章以截图的形式&#xff0c;每天高强度学习四五个小时&#xff0c;精力缺乏&#xff0c;我认为&#xff0c;如果想学习这个深度学习&#xff0c;你需…