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.rhkb.cn/news/350603.html

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

相关文章

算法day26

第一题 429. N 叉树的层序遍历 本题的要求我们可以通过队列来辅助完成层序遍历; 如下图的n叉树: 步骤一: 我们定义一个队列,先进行根节点入队列操作; 步骤二: 我们进行当前队列每一个元素的出队列操作&…

功能强大的API函数FindFirstFile使用介绍(附源码)

在处理文件的相关代码中,会频繁使用到Windows系统API函数FindFirstFile,这个函数功能很强大,很多功能都不开它。本文就根据我们在项目中使用该函数的情况,来大概地梳理一下使用FindFirstFile都可以实现哪些常用的功能。 1、FindFirstFile函数声明与WIN32_FIND_DATA结构体 我…

接口测试详解

接口测试详解 本文主要讲软件接口 一、什么是接口?硬件接口:硬件接口指的是硬件提供给外界的一种实体。主要作用是内部数据分离出外 部的沟通方法 目的是:沟通外部来改变内部的数据。如:USB接口,投影仪接口 软件接口…

Hadoop 2.0:主流开源云架构(三)

目录 四、Hadoop 2.0体系架构(一)Hadoop 2.0公共组件Common(二)分布式文件系统HDFS(三)分布式操作系统Yarn(四)Hadoop 2.0安全机制简介 四、Hadoop 2.0体系架构 (一&…

c++使用nlohmann读取json文件

下载&#xff1a; GitHub - nlohmann/json: JSON for Modern C 解压&#xff1a; 包含头文件&#xff1a; 要包含的头文件和要使用的命名空间&#xff1a; #include <nlohmann/json.hpp>using json nlohmann::json; 测试文件&#xff1a; 代码&#xff1a; #include…

Vscode中使用make命令

前言 需要注意&#xff0c;如下操作需要进行网络代理&#xff0c;否则会出现安装失败的情况 安装 第一步 — 安装MingGW &#xff08;1&#xff09;进入官网下载 &#xff08;2&#xff09;下载完成之后&#xff0c;双击exe文件 &#xff08;3&#xff09;点击Install &#x…

远程桌面端口,远程桌面改端口有哪些方法

方法一&#xff1a;通过修改注册表 步骤一&#xff1a;打开注册表编辑器 按下 Windows键R 打开“运行”对话框。输入 regedit 并按 Enter 打开注册表编辑器。 步骤二&#xff1a;定位到远程桌面服务的端口设置 导航至第一个注册表路径&#xff1a;HKEY_LOCAL_MACHINE\SYSTE…

抢占人工智能行业红利,前阿里巴巴产品专家带你15天入门AI产品经理

前言 当互联网行业巨头纷纷布局人工智能&#xff0c;国家将人工智能上升为国家战略&#xff0c;藤校核心课程涉足人工智能…人工智能领域蕴含着巨大潜力&#xff0c;早已成为业内共识。 面对极大的行业空缺&#xff0c;不少人都希望能抢占行业红利期&#xff0c;进入AI领域。…

多线程中run()和start()的区别

我们知道&#xff0c;在多线程中 Thread thread new Thread(runnable); thread.start();以及 thread.run();都可以执行runnable中run方法下的代码&#xff0c;但是二者又有所不同 下面给出一段代码用以体现二者的区别&#xff1a; 以下代码中&#xff0c;通过thread.start()启…

探索互联网寻址机制 | 揭秘互联网技术的核心,解析网络寻址

揭秘互联网技术的核心&#xff0c;解析网络寻址题 前提介绍局域网地址IP地址的分配方式动态IP分配机制内部网&#xff08;intranet&#xff09;ICANN负责IP分配DHCP协议获取IP地址 域名系统域名是什么域名工作方式hosts文件存储域名映射关系DNS分布式数据库DNS域名解析 Java进行…

搭建知识付费APP平台教学:在线教育系统源码详解

如何搭建一个高效的知识付费APP平台呢&#xff1f;今天&#xff0c;笔者将详细解析在线教育系统的源码&#xff0c;帮助您快速搭建自己的知识付费APP平台。 一、平台的核心功能 一个完整的知识付费APP平台通常需要具备以下核心功能&#xff1a; 用户管理 内容管理 支付 课…

【秋招突围】2024届秋招笔试-小红书笔试题-第一套-三语言题解(Java/Cpp/Python)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系计划跟新各公司春秋招的笔试题 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f4e7; 清隆这边…

CrossOver 2024软件安装包下载

CrossOver不像Parallels或VMware的模拟器&#xff0c;而是实实在在Mac OS X系统上运行的一个软件。CrossOvers能够直接在Mac上运行Windows软件与游戏&#xff0c;而不需虚拟机。它为Windows软件提供所需的资源&#xff0c;以达到在Mac OS X系统上运行Windows程序的目的。 安 装…

模型 WOOP

说明&#xff1a;系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。不再拖延和懒惰&#xff0c;让梦想照进现实。 1 WOOP模型的应用 1.1 WOOP模型提高自己健身习惯 如果你想要养成健身的习惯&#xff0c;那么使用WOOP模型来提高自己健身习惯&#xf…

【第9章】Vue之Element Plus快速入门

文章目录 前言一、安装1. 兼容性2. 安装 二、按需导入1.自动导入2.Vite 三、全局配置四、官方案例五、效果总结 前言 基于 Vue 3&#xff0c;面向设计师和开发者的组件库。 一、安装 1. 兼容性 Element Plus 目前还处于快速开发迭代中。 由于 Vue 3 不再支持 IE11&#xff0c…

vite-plugin-mock前端自行模拟接口返回数据的插件

vite-plugin-mock前端自行模拟接口返回数据的插件 安装导入、配置&#xff08;vite.config.js&#xff09;使用目录结构/mock/user.js具体在页面请求中的使用 注意事项 中文文档&#xff1a;[https://gitcode.com/vbenjs/vite-plugin-mock/blob/main/README.zh_CN.md) 参考其他…

紫光展锐5G处理器T750__国产手机芯片5G方案

展锐T750核心板采用6nm EUV制程工艺&#xff0c;CPU架构采用了八核设计&#xff0c;其中包括两个主频为2.0GHz的Arm Cortex-A76性能核心和六个主频为1.8GHz的A55小核。这种组合使得T750具备卓越的处理能力&#xff0c;并能在节能的同时提供出色的性能表现。该核心模块还搭载了M…

Java17 --- RabbitMQ之插件使用

目录 一、Federation插件 1.1、运行两个rabbitmq实例 1.2、启用插件 1.3、在下游端点添加上游端点 1.4、创建策略 1.6、测试 二、联邦队列 2.1、创建策略 2.2、创建交换机与队列 2.2.1、创建52000的队列与交换机 2.2.2、创建62000的队列 三、Shovel 3.1、启…

探索uni-app x:下一代跨平台应用开发引擎

摘要 随着移动互联网的快速发展&#xff0c;跨平台应用开发的需求日益旺盛。传统的原生开发虽然性能卓越&#xff0c;但开发周期长、维护成本高。而Web应用开发虽然开发效率高&#xff0c;但性能往往不尽如人意。在这样的背景下&#xff0c;uni-app x应运而生&#xff0c;作为…

Qt项目天气预报(2) - 重写事件函数

鼠标右键实现退出界面 知识点QMenu: QMenu 弹出对话框 --> 相对QMessageBox 更加轻量点 QMenu是Qt库中用于创建弹出式菜单的类&#xff0c;它通常出现在应用程序的顶部菜单栏、按钮的右键菜单或自定义上下文菜单中。以下是关于QMenu的详细介绍&#xff1a; 1. 类的基本特…