当前位置: 首页 > news >正文

【Linux下代码调试工具】gdb 的基本使用

gdb的基本使用

  • 前言
  • 准备gdb工具
  • 调试须知
  • gdb的基本指令
    • 进入调试
    • 退出调试
  • 显示代码及函数内容
    • 运行程序
    • 给程序打断点
    • 查看断点位置
    • 断点使能
    • 取消断点
    • 逐过程调试
    • 逐语句调试
    • 运行到下一个断点
    • 查看变量的值
    • 变量值常显示
    • 取消变量值常显示

前言

在主页前面的几篇文章已经介绍了Vim编辑器及Makefile编译工具的使用。但在实际编程中往往事与愿违,所写代码中有一些小bug需要修改一下。请添加图片描述
用过Vs的应该知道,我们调试需要知道程序执行的某一个细节,包括变量的值、函数的调用过程等从而发现隐藏的错误代码。
但是Linux没有图形化界面,所以需要借助工具来进行代码调试,当然这个工具对于初学者可能会不太适应。请添加图片描述

准备gdb工具

首先检查一下自己Linux是否安装有gdb工具
命令:gdb -v
作用:查看gdb的版本号
在这里插入图片描述
如果显示出gdb的版本,则说明已经安装。

如果没有安装则根据以下操作
命令:yum -y install gdb
作用:安装gdb

调试须知

可执行程序有两种编译版本,一个是Debug版本另一个是Release版本

Debug 通常称为调试版本,它包含调试信息,并且不作程序优化,便于程序员调试程序。

Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用,但其不包含调试信息

为什么要先对这两个版本进行解释呢?因为Linux下gcc/g++默认编译出的版本为Release版本;是不带调试信息的无法使用 gdb 工具对其进行调试。
如下图请添加图片描述
实际上使用gcc/g++进行编译,如果我们需要Debug版本需要在编译指令上加 -g 命令
如:gcc -o testDebug test.c -g
在这里插入图片描述
总结:
1:程序的编译有两种一个是Debug版本另一个是Release版本
2:Linux下gcc/g++的默认编译方式是编译出Release版本
3:要用gdb调试工具就必须在编译时加上 -g 选项,使其可执行程序为Debug版本

gdb的基本指令

首先咱看一下本文所用的被调试文件test.c中的代码如下
在这里插入图片描述
下面是我总结的命令,后面我会示范一些常用的给大家

gdb 文件名 :进入调试
q :退出gdb
l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
l 函数名:列出某个函数的源代码。
r :运行程序
b 行号:在某一行设置断点
b 函数名:在某个函数开头设置断点
info b :查看所有信息。
d break:删除所有断点
d 断点编号 :删除序号为n的断点
disable breakpoints 断点编号:禁用断点
enable breakpoints 断点编号:启用断点
n :单条执行。
s :逐语句调试/进入函数调用
finish:执行到当前函数返回,然后挺下来等待命令
p 变量:打印变量值。
display 变量名:跟踪查看一个变量,每次停下来都显示它的值
undisplay:取消对先前设置的那些变量的跟踪
set var:修改变量的值
continue(或c):从当前位置开始连续而非单步执行程序
run(或r):从开始连续而非单步执行程序
info(或i) breakpoints:参看当前设置了哪些断点
until X行号:跳至X行
breaktrace(或bt):查看各级函数调用及参数
info(i) locals:查看当前栈帧局部变量的值

进入调试

命令:gdb 文件名
作用:启动调试
注意:只是启动调试,程序并没有运行
如下图:
在这里插入图片描述

退出调试

命令:q
作用:退出调试请添加图片描述

显示代码及函数内容

命令:l
作用:显示当前执行代码及周围10行,l 的特点是每次只显示10行
在这里插入图片描述
命令:l 行号
作用:显示指定行号内容
在这里插入图片描述
命令:l 行号,行号
作用:显示指定行号内的内容,如下图 l 7,11 命令表示显示7到11行的内容。这种命令方式因为是指定式的所以可显示10行以上的内容。
在这里插入图片描述
命令:l 函数名
作用:显示函数代码
在这里插入图片描述

运行程序

命令r
作用:运行程序
注意:此命令和Vs中的F5功能一致,运行过程中遇到断点才会停下,如果没遇到断点程序会直接运行致结束
在这里插入图片描述

给程序打断点

命令:b 行号
作用:给指定行号打断点方便调试
在这里插入图片描述

查看断点位置

命令:info b
作用:查看程序中各断点位置
在这里插入图片描述
解释:
Num : Num下方是断点编号(取消断点时需要用到断点编号)
Type : 表示该标记是断点
Enb : 代表使能,y代表打开, n代表关闭
what : 表示改断点在那个函数和文件中及在第几行

断点使能

命令:disable breakpoint 断点编号
功能:该断点使能关闭(该断点功能不生效)
在这里插入图片描述
命令:enable breakpoint 断点编号
功能:该断点使能打开(该断点功能生效)
在这里插入图片描述

取消断点

命令: d 断点编号
作用:取消该断点
注意:取消断点用的是断点编号(用info b 查看),不是用行号;
在这里插入图片描述
命令:d break
作用:取消所有断点
在这里插入图片描述

逐过程调试

命令: n
功能:逐过程调试(和vs调试时的F10一致)
在这里插入图片描述

逐语句调试

命令:s
功能:逐语句调试
在这里插入图片描述

运行到下一个断点

命令:c
作用:运行到下一个断点
在这里插入图片描述

查看变量的值

命令:p 变量
功能:查看变量的值
在这里插入图片描述
命令:p &变量
功能:查看变量的地址
在这里插入图片描述

变量值常显示

上一个命令 p ,只能显示一次变量的值。如果我们想一直看着变量的变化就得用其他命令。
命令:display 变量名(或取地址)
功能:跟踪显示某个变量的值,每次停下都显示他的值
请添加图片描述

取消变量值常显示

命令:undisplay 编号
功能:取消变量值常显示
在这里插入图片描述

相关文章:

【Linux下代码调试工具】gdb 的基本使用

gdb的基本使用前言准备gdb工具调试须知gdb的基本指令进入调试退出调试显示代码及函数内容运行程序给程序打断点查看断点位置断点使能取消断点逐过程调试逐语句调试运行到下一个断点查看变量的值变量值常显示取消变量值常显示前言 在主页前面的几篇文章已经介绍了Vim编辑器及Ma…...

UART和RS232、RS485的联系和区别、以及对软件编程的影响

1、串口、UART、RS232、RS485概念的理解 (1)狭义上的串口:指的是串口协议,就是时序图、数据收发先后顺序等,是抽象出来的协议; (2)广义上的串口:指的是符合串口协议的接口,UART、RS232、RS485在实际工作中都…...

ajax是什么?咋实现的

创建交互式网页应用的网页开发技术 再不重新加载整个网页的前提下,与服务器交换数据并且更新部分内容 简单来说就是无页面刷新的数据交互 通过创建xmlhttprequest对象向服务器异步发送请求从而获取数据,然后操作dom更新内容 1,创建xmlhttpr…...

AI推理计算框架中的内存优化

背景 内存管理是AI计算中非常重要的一部分。我们希望模型计算时占用内存尽可能小,这样我们训练或推理时就可以用更大的batch size使其尽快收敛,或者提高吞吐率。又或者让我们可以使用参数更多、或更复杂的模型从而达到更好的准确率。由于现代深度学习模…...

C语言学习小结(1)——初认识C语言

一、C语言概念 C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易 的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。尽管C语言提供了许多低级处理的功能,但仍然保持着…...

30分钟吃掉wandb可视化自动调参

wandb.sweep: 低代码,可视化,分布式 自动调参工具。使用wandb 的 sweep 进行超参调优,具有以下优点。(1)低代码:只需配置一个sweep.yaml配置文件,或者定义一个配置dict,几乎不用编写调参相关代码。(2)可视化…...

【8】AMBA_SOC项目自学IC验证项目-仿真平台脚本使用讲解

仿真平台文件介绍和脚本使用说明 1、项目路径:2、文件夹说明:3、仿真运行命令:第一步:进入项目路径第二步:设置环境第三步:运行仿真第四步:查看波形1、项目路径: 位置:/tool/project/axi 2、文件夹说明: a、env就是放的我们uvm环境相关的env文件; b、out就是我们…...

智慧水务未来技术发展方向预测探讨

随着科技的不断发展和城市化的加速,智慧水务作为一种新的水务模式,逐渐受到广泛关注。未来,智慧水务将会面临更多的技术挑战和商机。本博客将对智慧水务的未来技术发展方向进行预测,以探讨智慧水务未来可能的技术重点。 1. 人工…...

数据结构 | 栈与队列

🔥Go for it!🔥 📝个人主页:按键难防 📫 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀 📖系列专栏:数据结构与算法 &#x1f52…...

Redux 源码分析

Redux 目录结构 redux ├─ .babelrc.js ├─ .editorconfig ├─ .gitignore …...

第五十二章 BFS进阶(二)——双向广搜

第五十二章 BFS进阶(二)——双向广搜一、双向广搜1、优越之处2、实现逻辑3、复杂度分析二、例题1、问题2、分析3、代码一、双向广搜 1、优越之处 双向广搜是指我们从终点和起点同时开始搜索,当二者到达同一个中间状态的时候,即相…...

业务建模题

一. 单选题:1.在活动图中负责在一个活动节点执行完毕后切换到另一个节点的元素是( A)。A.控制流 B.对象流 C.判断节点 D.扩展区城2.以下说法错误的是(C)。A.活动图中的开始标记一般只有一一个,而终止标记可能有多个B.判断节点的出口条件必须保证不互相重复,并且不缺…...

电子秤专用模拟数字(AD)转换器芯片HX711介绍

HX711简介HX711是一款专为高精度电子秤而设计的24 位A/D 转换器芯片。与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。降低了电子秤的整机成本&#xff…...

微服务 RocketMQ-延时消息 消息过滤 管控台搜索问题

~~微服务 RocketMQ-延时消息 消息过滤 管控台搜索问题~~ RocketMQ-延时消息实现延时消息RocketMQ-消息过滤Tag标签过滤SQL标签过滤管控台搜索问题RocketMQ-延时消息 给消息设置延时时间,到一定时间,消费者才能消费的到,中间件内部通过每秒钟扫…...

js发送邮件(node.js)

以前看别人博客留言或者评论文章时必须填写邮箱信息,感觉甚是麻烦。 后来才知道是为了在博主回复后让访客收到邮件,用心良苦。 于是我也在新增留言和文章评论的接口里,新增了给自己发送邮件提醒的功能。 我用的QQ邮箱,具体如下…...

English Learning - Day58 一周高频问题汇总 2023.2.12 周日

English Learning - Day58 一周高频问题汇总 2023.2.12 周日这周主要内容继续说说状语从句结果状语从句这周主要内容 DAY58【周日总结】 一周高频问题汇总 (打卡作业详见 Day59) 一近期主要讲了 一 01.主动脉修饰 以下是最常问到的知识点拓展&#xff…...

【微电网】基于风光储能和需求响应的微电网日前经济调度(Python代码实现)

目录 1 概述 2 知识点及数学模型 3 算例实现 3.1算例介绍 3.2风光参与的模型求解 3.3 风光和储能参与的模型求解 3.5 风光储能和需求响应都参与模型求解 3.6 结果分析对比 4 Python代码及算例数据 1 概述 近年来,微电网、清洁能源等已成为全球关注的热点…...

四种方式的MySQL安装

mysql安装常见的方法有四种序号 安装方式 说明1 yum\rpm简单、快速,不能定制参数2二进制 解压,简单配置就可使用 免安装 mysql-a.b.c-linux2.x-x86_64.tar.gz3源码编译 可以定制参数,安装时间长 mysql-a.b.c.tar.gz4源码制成rpm包 把源码制…...

软考高级信息系统项目管理师系列之九:项目范围管理

软考高级信息系统项目管理师系列之九:项目范围管理 一、范围管理输入、输出、工具和技术表二、范围管理概述三、规划范围管理四、收集需求1.收集需求:2.需求分类3.收集需求的工具与技术4.收集需求过程主要输出5.需求文件内容6.需求管理7.可跟踪性8.双向可跟踪性9.需求跟踪矩阵…...

【项目精选】javaEE健康管理系统(论文+开题报告+答辩PPT+源代码+数据库+讲解视频)

点击下载源码 javaEE健康管理系统主要功能包括:教师登录退出、教师饮食管理、教师健康日志、体检管理等等。本系统结构如下: (1)用户模块: 实现登录功能 实现用户登录的退出 实现用户注册 (2)教…...

golang循环变量捕获问题​​

在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下: 问题背景 看这个代码片段: fo…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

MMaDA: Multimodal Large Diffusion Language Models

CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...