gdb调试技巧

gdb调试教程

  • 前言
  • gdb的调试命令
    • 显示需要调试的代码:`l`( list )
    • 启动调试:`r` (run)
    • 断点:`b`(Breakpoint)
      • 设置断点
      • 查看断点:info b
      • 删除断点:d
      • 打开断点 / 关闭断点
    • 逐语句进行调试:n(next)
    • 逐过程进行调试:s(step)
    • 长显示变量值:display(内置类型、结构体和自定义类型)
    • 取消长显示变量:undisplay
    • 跳过某个区间代码的调试:until
    • 跳转断点操作:c
    • 直接执行当前函数功能:finish
    • 退出 gdb 调试:q(quit)

前言

在Linux中,使用 gcc / g++ 默认形成的可执行程序都是release版本,而release版本是不能进行调试的。

因此在使用gdb调试程序时,我们要用到debug版本。gcc/g++ 形成debug版本的可执行程序如下:

在编译源文件时我们只需要带上-g选项即可,下面以test.c源文件为例子

gcc -o test-debug test.c -g

gdb的调试命令

以上面生成的test-debug可执行文件为例子,首先要进入调试模式:

gdb test-debug

如果显示以下情况,说明没有安装gbd
在这里插入图片描述
在终端输入以下命令即可安装gdb:

sudo yum -y install gdb

显示需要调试的代码:l( list )

在gdb调试下直接输入l命令会随机定位代码,想要定位到最开始的代码位置直接输入:

l 0

又或者:

l 1

提示:l 1之间是存在空格的

当然也是可以直接定位显示到main函数所在的代码位置,命令如下:

l main

输入完对应要求指令后,后续一直输入回车,可以将调试代码按当前行号最后一行代码依次往后都显示到终端上。

启动调试:r (run)

在gdb下直接输入:

r

gdb下的r命令就好比VS下的F5快捷键,在没有断点或是输入的情况下会将程序运行起来并且直接跑完,遇到断点或是需要输入时才会停下来。因此r命令要和断点配合使用

断点:b(Breakpoint)

设置断点

  • b命令后加上需要打上断点的行号( b 和行号之间需要空格)
b 100  //在100行代码处打断点
  • 也可以在b命令后+文件名称++行号 (b 和文件名之间存在空格)
b test.c:100
  • 在文件中找打对应函数打断点: 在 b 命令后 + 当前文件名字 + : + 函数名 (b 和文件名之间存在空格)
b test.c:main

提示:在文件中打对应函数断点会默认出现在函数内部代码的第一行,并不会出现在函数名行

查看断点:info b

info b

例如,在 test.c 源文件内容如下:
在这里插入图片描述
gdb下执行以下操作:
在这里插入图片描述
查看断点时会将所有的断点信息都显示出来,从哪行开始打的断点,该断点的编号就是第一个。

删除断点:d

  • 删除断点:输入d命令后面需要加上该断点的编号

如将上面的第六行代码的断点删除操作如下:

d 1      //删除编号为1的断点

在这里插入图片描述

  • 删除所有断点:
d breakpoints  //删除所有断点

打开断点 / 关闭断点

  • 打开断点:enable breakpoint + 断点编号
enable breakpoint 5  //将编号为5的断点进行打开
  • 关闭断点:disable breakpoint + 断点编号
disable breakpoint 5 //对编号为5的断点失能

在进行调试时,关闭当前断点后,不会在这个断点处进行停留,称为当前断点为失能断点。

逐语句进行调试:n(next)

  • 逐语句调试是指:当程序遇到函数调用时,调试器会执行整个函数,然后跳到函数返回后的下一条语句,而不进入函数内部。
n

这里输入的n 指令就好比 Visual Studio 中的 F10 快捷键

逐过程进行调试:s(step)

  • 逐过程调试是指:当程序执行到包含函数调用的语句时,逐过程调试会进入函数内部,并逐行执行函数内的代码(在这里输入指令时,不管是不是库函数都会进入到函数内部)
s

这里输入的 s 指令就好比 Visual Studio 中的 F11 快捷键

长显示变量值:display(内置类型、结构体和自定义类型)

  • 在逐过程或是逐语句调试代码时,显示对应想要知道的变量值。
display 变量名称

在这里插入图片描述

设置了长显示变量后, 最前面会带有编号。这个编号是用于后续取消调用变量的显示作用
在这里插入图片描述

设置了长显示变量后,每次输入指令 n 或者s后,先显示执行代码随后都会显示变量值。

取消长显示变量:undisplay

  • 取消每次调试时所显示的变量值
undisplay 变量名编号

在这里插入图片描述

跳过某个区间代码的调试:until

  • 在函数内,进行指定位置跳转,直接执行完区间代码(until 与 行号之间存在空格)
until 行号       //从当前行代码跳转到对应行号代码上

例如下面简单循环代码,要执行20次重复操作,逐过程或是逐语句都没办法,一直输入n / s 指令难免会烦躁
在这里插入图片描述

在这里插入图片描述

此时使用 until 命令跳出循环,直接到15行代码即可:
在这里插入图片描述

跳转断点操作:c

  • 从当前断点直接运行到下一个断点处,直接输入指令c
c

此操作好比Visual Studio中当前断点按下快捷键F5后到下一个断点处

直接执行当前函数功能:finish

  • 执行当前函数功能,返回到调用该函数对应行号,不对该函数返回值进行赋值操作
finish

finish指令会直接完成当前函数功能,然后退回到调用该函数的行号处停下来。

来看以下例子:
在这里插入图片描述
在这里我们先进入Sum函数中
![在这里插在这里插入图片描述
输入指令finish后,可以发现执行的代码会直接跳转到12行处,但是 sum1 变量没有被赋值。

退出 gdb 调试:q(quit)

调试完代码后之间输入q命令即可退出 gdb 模式。

当然在调试过程中如果输入q命令会弹出是否退出调试的提示,此时再输入 y 即可。

gdb基本调试技巧就讲到这里,感谢大家的支持!!!

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

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

相关文章

node 之 http模块

1.什么是http模块 在网络节点中,负责消费资源的电脑叫做客户端;负责对外提供网络资源的电脑,叫做服务器 http模块是node.js官方提供的,用来创建web服务器的模块,通过http模块提供的http.createServer()方法&#xff0c…

数仓开发环境链接

这里写目录标题 1开发工具链接大数据组件1.1 启动hiveserver21.2配置DataGrip连接1.3测试使用 2 环境问题排查思路 1开发工具链接大数据组件 1.1 启动hiveserver2 数仓开发工具datagrip 需要用到JDBC协议链接到Hive,需要启动hiveserver2。 cd /opt/module/hive h…

c语言day4 运算符 表达式 三大控制结构

1: 2: 输入一个年月日 计算这是这一年的第几天 17 int year,month,day;18 printf("请输入年份 月份 日期");19 scanf("%d %d %d",&year,&month,&day);20 int feb28;21 if(year%40&&year%1…

周鸿祎首堂免费课与千万网友分享“AGI趋势”

“我讲课不割韭菜,宗旨是免费、分享、科普、交流。AI时代技术发展迅速,AI知识普及尤为重要。”2月29日,360公司创始人周鸿祎免费课正式开启,全网多平台直播了AI系列第一讲“预见AGI”,千万网友观看。免费课上&#xff…

BUUCTF crypto做题记录(11)新手向

一、[HDCTF2019]bbbbbbrsa 题目所给的信息我汇总到以下代码中 from base64 import b64encode as b32encode from gmpy2 import invert,gcd,iroot from Crypto.Util.number import * from binascii import a2b_hex,b2a_hex import randomflag "************************…

mysql数据库安装与使用(一)

目录 前言 一,安装mysql数据库 二,mysql数据库使用 连接mysql数据库 创建数据库 创建表格 插入数据 查询数据 更新数据 删除数据 关闭连接 使用数据库 查看所有数据库 查看数据库中的表 三,mysql设置 创建用户 授予权限 刷新权…

怎么制作文件类型二维码?文件二维码如何加密?

现在将文件转二维码图片后,分享生成二维码来扫码查看或者下载文件的方式,在很多的场景中都有应用。这个方法的优势在于,成本低而且安全性高,有利于用户快速获取内容的速度,有效提高用户体验,而且日常使用的…

ZABBIX修改web界面的 “支持“,“帮助”,“Integrations“。等菜单按钮,百试百灵,删除修改Help,Support菜单

♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ **ZABBIX修改web界面的 “支持”,“帮助”,“Integrations”。等菜单按钮&#xff0c…

基于 Transformer 的中文对联生成器

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…

javaWeb学习04

AOP核心概念: 连接点: JoinPoint, 可以被AOP控制的方法 通知: Advice 指哪些重复的逻辑,也就是共性功能(最终体现为一个方法) 切入点: PointCut, 匹配连接点的条件,通知仅会在切入点方法执行时被应用 目标对象: Target, 通知所应用的对象 通知类…

模糊PID控制算法实战讲解-案例温度控制(附C语言实现)

可结合之前的文章一起理解: 控制算法-PID算法总结-从公式原理到参数整定解析(附C源码)_pid自整定算法-CSDN博客 模糊控制算法实战讲解-案例温度控制(附C语言实现)-CSDN博客 目录 一、模糊PID控制的原理 1.1 模糊化…

Decision Transformer

DT个人理解 emmm, 这里的Transformer 就和最近接触到的whisper一样,比起传统Transformer,自己还设计了针对特殊情况的tokens。比如whisper里对SOT,起始时间,语言种类等都指定了特殊tokens去做Decoder的输入和输出。 DT这里的作为输入的Tokens由RL里喜闻乐见的历史数据:…

Java优先级队列--堆

目录 1. 优先级队列 1.1 概念 2.优先级队列的模拟实现 2.1 堆的概念 2.2 堆的存储方式 2.3 堆的创建 2.3.1 堆向下调整 2.3.2 堆的创建 2.3.3 建堆的时间复杂度 2.4 堆的插入与删除 2.4.1 堆的插入 2.4.2 堆的删除 2.5 用堆模拟实现优先级队列 3.常用接口介绍 3…

什么是VR紧急情况模拟|消防应急虚拟展馆|VR游戏体验馆加盟

VR紧急情况模拟是利用虚拟现实(Virtual Reality,简称VR)技术来模拟各种紧急情况和应急场景的训练和演练。通过VR技术,用户可以身临其境地体验各种紧急情况,如火灾、地震、交通事故等,以及应对这些紧急情况的…

贪心算法(算法竞赛、蓝桥杯)--修理牛棚

1、B站视频链接&#xff1a;A27 贪心算法 P1209 [USACO1.3] 修理牛棚_哔哩哔哩_bilibili 题目链接&#xff1a;[USACO1.3] 修理牛棚 Barn Repair - 洛谷 #include <bits/stdc.h> using namespace std; const int N205; int m,s,c,ans; int a[N];//牛的位置标号 int d[N…

奇怪的需求之与图片做交互

1.起因 客户想要展示自己的地图,该地图上有各种工作数据,和工作点位,已有的地图不能满足需求.于是提出将这张图片当成大背景 2.经过 鉴于文件格式和尺寸的原因,协商后客户提出将图片做成缩放效果,同时具有点击效果,原先直接进入的主页,现在为点击图片中的某条线路进入主页面…

[LeetCode]143.重排链表

143. 重排链表 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/reorder-list/description/ 题目 示例 解题思路 寻找链表中点 链表逆序 合并链表 注意到目标链表即为将原链表的左半端和反转后的右半端合并后的结果。 这样我们的任务即可划分为三步&a…

Python中的os库

一.OS库简介 OS是Operating System的简写&#xff0c;即操作系统。 OS库是一个操作系统接口模块&#xff0c;提供一些方便使用操作系统相关功能的函数。 二.OS库常用函数 2.1文件和目录 2.1.1&#xff1a;os.getcwd() 作用&#xff1a;返回当前工作目录&#xff0c;结果是…

Python中re(正则)模块的使用

re 是 Python 标准库中的一个模块&#xff0c;用于支持正则表达式操作。通过 re 模块&#xff0c;可以使用各种正则表达式来搜索、匹配和操作字符串数据。 使用 re 模块可以帮助在处理字符串时进行高效的搜索和替换操作&#xff0c;特别适用于需要处理文本数据的情况。 # 导入…

如何在Window系统部署BUG管理软件并结合内网穿透实现远程管理本地BUG

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…