【Linux】gdb的使用

news2025/2/25 2:23:41

文章目录

  • 🎪 Linux下gdb的使用
    • 🚀1.gdb调试准备
    • 🚀2.gdb指令集
    • 🚀3.gdb指令演示
      • ⭐3.1 展示源文件代码
      • ⭐3.2 断点与多步调试操作
      • ⭐3.3 常用操作指令


🎪 Linux下gdb的使用

GDB 全称“GNU symbolic debugger”,是一个由GNU开源组织发布的,UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具从名称上不难看出,它诞生于 GNU 计划(同时诞生的还有 GCC、Emacs 等),是 Linux 下常用的程序调试器。发展至今,GDB 已经迭代了诸多个版本,当下的 GDB 支持调试多种编程语言编写的程序,包括 C、C++、Go、Objective-C、OpenCL、Ada 等。实际场景中,GDB 更常用来调试 C 和 C++ 程序。
在这里插入图片描述

🚀1.gdb调试准备

我们的代码编译过后的版本有两种,分别是Debug版(可调试版)和Release版(不可调试版),我们Linux下gcc/g++编译过后的版本默认是Release版本,不妨我们来验证以下:

test.c:

#include <stdio.h>

int addToTop(int top)
{
    printf("enter addToTop\n");
    int sum = 0;
    for(int i = 1; i <= top; i++)
    {
        sum += i;
    }
    printf("quit addToTop\n");
    return sum;
}

int main()
{
    int top = 100;

    int result = addToTop(top);
    printf("result:%d\n", result);
    return 0;
}

Makefile:

test:test.c
	gcc test.c -o test -std=c99
.PHONY:clean
clean:
	rm -rf test

-std=c99表示以c99的标准来进行编译

在这里插入图片描述
我们的猜想成立,编译器默认生成的可执行文件是不包含调试信息的(也就是不可被调试的)那么我们怎么才能让它变成可调试的呢?我们前几篇博客上讲的gcc基本指令中加上选项-g表示生成的可执行文件是可被调试的。详情请见:Linux编译器gcc/g++

我们修改Makefile文件为:

test-release:test.c
	gcc test.c -o test-release -std=c99
test-debug:test.c
	gcc -g test.c -o test-debug -std=c99
.PHONY:clean
clean:
	rm -rf test-release test-debug 

然后构建:
在这里插入图片描述
test-debug文件比test.release文件要大一些,因为其中包含了调试信息。这时我们再对test-debug进行gdb调试:

在这里插入图片描述

🚀2.gdb指令集

Linux调试器gdb的核心工作就是查找问题,下面我们来看一些基本指令:

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

🚀3.gdb指令演示

以我们的test-debug为例:

⭐3.1 展示源文件代码

  • 展示从0/9开始的后10行
    指令:l 0/9在这里插入图片描述
  • 展示addToTop的源代码
    指令: l addToTop
    在这里插入图片描述

⭐3.2 断点与多步调试操作

  • 对第20行,以及函数addToTop开头添加断点,并显示断点基本信息
    指令:b 20b addToTopinfo b
    在这里插入图片描述
  • 对第17行添加断点,运行程序展示单步调试
    指令:b 17rns
    在这里插入图片描述
  • 显示循环结束后sum的值,并将其修改为4090
    指令:until 11p sumset var sum = 4090
    在这里插入图片描述
  • 显示断点,删除序号为1的断点,禁用序号位2,3的断点,最后再启用3号断点
    指令:i bdelete breakpoints 1disable breakpoints 2disable breakpoints 3enable breakpoints 3
    在这里插入图片描述
  • 进入函数addToTop查看函数调用与参数以及函数栈帧中局部变量的值
    指令:bti locals
    在这里插入图片描述

⭐3.3 常用操作指令

我们gdb也存在git中三板斧,可以大大简化我们调试的过程分别是 finishuntilcontinue

  • 跳转到目前函数结束:finish
    在这里插入图片描述
    当我们不小心误入函数的时候,我们可以利用finish快速结束该函数

  • 执行到当前行以下的任意行:until
    在这里插入图片描述
    对于循环次数过多时,我们可以用until快速跳出循环

  • 断点跳转:continue
    在这里插入图片描述
    我们可以用continue来实现断点跳转

此外我们用p 变量的时候会感觉比较麻烦,每次都要输入命令来查看变量的值,我们可以用dispaly 变量的方式来长显示变量,这样我们每走一步,都会自动显示display过的变量名

在这里插入图片描述
如果想要删除长显示过的变量,用undisplay 变量即可

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

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

相关文章

dp(十)* 0-1背包与完全背包的组合数问题 搞清组合数与排列数

目录 兑换零钱(二)_牛客题霸_牛客网&#xff08;完全背包&#xff09; 494. 目标和&#xff08;0-1背包&#xff09; 分割等和子集_牛客题霸_牛客网 兑换零钱(二)_牛客题霸_牛客网&#xff08;完全背包&#xff09; 描述 给定一个整数数组 nums 表示不同数额的硬币和一个正…

拉伯证券|社会消费复苏将是2023年主旋律

安排指出&#xff0c;兔年新年黄金周社会消费平稳复苏。全国范围看&#xff0c;依据国家税务总局增值税发票数据&#xff0c;2023年新年黄金周&#xff08;1月21日-27日&#xff0c;阴历岁除至正月初六&#xff09;&#xff0c;全国消费相关工作销售收入同比2022年新年假日添加…

Qt 进程(基本用法)

进程的使用情况&#xff1a; 运行的当前的应用中调用外部程序来实现功时调使用到进程。 比如&#xff1a;在你的运行程序中&#xff0c;开启迅雷或开启其他程序QProcess类用来 启动一个外部程序并与之通信QProcess类 常用一些函数&#xff1a; start&#xff08;&#xff09;…

Pycharm 中Torch安装方法

1.使用自带工具安装依次打开菜单&#xff1a;File->Setting点击号&#xff0c;搜索torch选择1.13.0版本安装安装错误&#xff1a;具体包含很长一段错误记录&#xff0c;如下&#xff1a;Collecting torch1.13.0Downloading https://files.pythonhosted.org/packages/ec/5e/8…

网络协议栈简单设计(tcp)

网络协议栈简单设计(tcp) 接着这篇文章写的 TCP相对于Udp&#xff0c;分为两个部分&#xff1a;连接&#xff08;三次握手、四次挥手&#xff09;、交互&#xff08;数据传输&#xff09; 三次握手 tcp包结构体定义 依照tcp包头字段定义就行&#xff1a; 注意&#xff0c;…

jenkins配置

ssh配置 选择Manager Jenkins 选择Configure System&#xff0c;进入页面一直拉到底 Remote Directory&#xff1a;是你需要从jenkins服务拷贝到远程应用服务指定的目录 高级&#xff1a;可以配置ssh密码 配置maven&#xff0c;git&#xff0c;jdk 选择 Global Tool Configur…

dpdk无锁队列rte_ring实现分析

1. 概述 rte_ring(以下简称ring)是一个高效率的无锁环形队列&#xff0c;它具有以下特点&#xff1a; FIFO队列长度是固定的&#xff0c;所有指针存放在数组中无锁实现(lockless)多消费者或单消费者出队多生产者或单消费者入队批量(bulk)出队 - 出队N个对象&#xff0c;否则失…

05.抽象工厂模式

05.抽象工厂模式 概念 抽象工厂模式&#xff1a;提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无须指定他们具体的类。抽象工厂又称为Kit模式&#xff0c;属于对象创建型模式。 抽象工厂可以将统一产品族的单独工厂封装起来&#xff0c;在正常使用中&#xff0…

08.适配器模式

08.适配器模式 概念&#xff1a; 将一个类的接口转化成用户需要的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 适配器模式可以分为类适配器和对象适配器两种&#xff0c;区别在于适配器角色对应被适配角色的适配是通过继承还是组合…

单月涨粉30w+,他们掌握引流法宝,小红书1月创作趋势是什么?

新年来到&#xff0c;在刚过去的1月&#xff0c;小红书平台涌现出哪些黑马博主&#xff1f;品牌在投放种草方面有何亮眼表现&#xff1f;为洞察小红书平台的内容创作趋势及品牌营销策略&#xff0c;新红推出1月月度榜单&#xff0c;从创作者及品牌两方面入手&#xff0c;解析月…

计算机网络-I/O多路复用机制

I/O多路复用机制 I/O多路复用&#xff08;multiplexing&#xff09;的本质是通过一种机制&#xff08;系统内核缓冲I/O数据&#xff09;&#xff0c;让单个进程可以监视多个文件描述符&#xff08;File descriptor是计算机科学中的一个术语&#xff0c;是一个用于表述指向文件的…

2.11 PID控制算法(四)补充

文章目录 1、理论1、代码3、分析3.1 比例项:3.2 比例+积分3.3 比例+积分+微分1、理论 1、代码 typedef struct {s32 Uplimit; //输出限幅s32 Downlimit; //输出限幅s32 target; // 目标输出量s3

leveldb源码解析二——SSTable

本章解析leveldb的基本组件——SSTable&#xff0c;SSTable一旦形成&#xff0c;就不会被改变&#xff0c;SSTable的操作有以下2种&#xff1a; 1、构建SSTable&#xff0c;在minor compaction和major compaction时&#xff0c;会构建SSTable&#xff0c;其中minor compaction是…

Opencv DNN C++ CPU 平台编译配置过程

Opencv DNN C CPU 平台编译配置过程 以下内容基于 windows 平台&#xff0c;实际上不同平台在基础工具齐全的情况下&#xff0c;编译过程差异并不大。 opencv 随着版本的更新&#xff0c;对于不同算子的支持也会逐步完善&#xff0c;所以尽量使用新的版本。 同时也可以把对应…

TCP滑动窗口协议与流量控制

谈到TCP的滑动窗口协议与流量控制&#xff0c;便会想起2006年去华为-3COM&#xff08;现H3C公司时&#xff09;面试时的场景。 当年毕业后&#xff0c;刚刚学了一点TCP的皮毛&#xff0c;仅仅是知道了TCP是面向连接的协议&#xff0c;以对每个报文都进行确认超时重传的机制来保…

摸鱼时间,画个吃豆人玩一下

Ⅰ . 吃豆人小游戏 Canvas API&#xff08;画布&#xff09;是在 HTML5 中新增的标签用于在网页实时生成图像&#xff1b;是一个非常适合&#xff0c;做一些有趣的小游戏 和 动画&#xff1b;下面我们来简单的写一下 这个小例子 &#x1f447; 文章目录Ⅰ . 吃豆人小游戏Ⅱ. 实…

学习嵌入式必读十本书,从C语言到ARM

学习嵌入式必读的十本书籍&#xff0c;按照C语言、数据结构、Linux、C、QT、单片机、ARM的顺序给大家推荐。 01 C语言 凡是计算机、电子、通信、自动化、机械专业的同学&#xff0c;大一的时候必学C语言&#xff0c;而且大部分高校选择的教材都是谭浩强。这本书在网上的评价褒…

【计算机程序设计思想与方法】2 什么是计算思维?

1.2 什么是计算思维? 如《【计算机程序设计思想与方法】1 什么是计算?》中所述,计算是利用计算机一步一步地执行指令来解决问题的过程,计算机科学是关于计算的科学。 正如数学家在证明数学定理时,有独特的数学思维。工程师在设计制造产品时,有独特的工程思维。艺术家在…

【验证码逆向专栏】某验“初代”滑块验证码逆向分析

声明 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 本文章未经许可禁止转载…

【算法】递归

目录1.递归概述2.何时使用递归2.1.定义是递归的2.2.数据结构是递归的2.3.问题的求解方法是递归的3.递归模型4.应用本文参考&#xff1a; 《数据结构教程》第 5 版 李春葆 主编 1.递归概述 &#xff08;1&#xff09;在定义一个过程或函数时&#xff0c;出现直接或者间接调用自…