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…

力扣哈希表篇

以下解题思路来自代码随想录以及力扣官方 文章目录 242.有效的字母异位词349.两个数组的交集202.快乐数1.两数之和15.三数之和 242.有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是s 的字母异位词。 输入: s "anagram", t &qu…

数仓开发环境链接

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

Vue项目中,src目录下的vue.app文件介绍

在 Vue 项目中,src 文件夹通常包含了项目的核心代码。在这个文件夹下,App.vue 是一个特殊的文件,它代表了整个 Vue 应用的根组件。 App.vue 是一个单文件组件(Single File Component, 简称 SFC),它允许你将…

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 "************************…

[Flutter]倒计时和计时器

1.延迟执行 Future.delayed 使用Future.delayed可以在延迟一定时间后执行代码。这是实现延迟执行最简单的方式之一。 Future.delayed(Duration(seconds: 1), () {// 这里的代码会在1秒后执行print(This message is displayed after 1 second.); }); Timer Timer类提供了更…

20240227-Python Tkinter学习笔记

文章目录 Label标签Label标签和Button按钮Listbox列表Radiobutton单选按钮Scale滑动条Checkbutton多选框Canvas画布Menubar 菜单Frame框架Messagebox弹窗pack/grid/place 布局方式登录注册案例 Label标签 import tkinter as tk # 导入tkinter模块,并简写为tk# 创建…

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

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

全量知识系统问题及SmartChat给出的答复 之3

Q8. 进一步,请展示如何使用这些技术来衡量、评估或适应不可避免的不匹配的知识汤问题的更进一步的全面代码。 为了处理不可避免的不匹配的知识汤问题,我们可以引入一些技术方法来衡量、评估或适应这种情况。 下是一个更进一步的全面代码示例&#xff0…

代码随想录算法训练营Day30|332.重新安排行程、51. N皇后、37. 解数独

332.重新安排行程 题目链接&#xff1a;332.重新安排行程 文档链接&#xff1a;332.重新安排行程 C实现 class Solution { private:unordered_map<string,map<string,int>> targets;bool backtracking(int ticketNum, vector<string>& result) {if(resu…

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

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

【Kubernetes】服务(Service)是什么?有什么用?有哪些类型?

系列文章目录 K8s中的Namespace是什么&#xff1f; Kubernetes 集群的组件介绍 Kubernetes 对象是什么&#xff1f; Pod——k8s中最重要的对象之一 Kubernetes 和 Docker 之间有什么区别&#xff1f; 部署安装 K8s 为什么要关闭 swap 分区&#xff1f; k8s中容器之间、pod之间…

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

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

基于 Transformer 的中文对联生成器

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

javaWeb学习04

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

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

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

边读 Emacs Lisp Intro 边做题(五)

文章目录 边读Emacs Lisp Intro边做题&#xff08;五&#xff09; 边读Emacs Lisp Intro边做题&#xff08;五&#xff09; 打开emacs&#xff0c;按C-h i打开Info页&#xff0c;找到Emacs Lisp Intro。 这里的\\b\\([^ \n\t]\\)[ \n\t]\\1\\b抄自题目描述中提供的链接&#…

Decision Transformer

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