Linux下的调试工具——GDB

news2024/11/18 4:23:30

GDB

1.什么是GDB

GDB 是由 GNU 软件系统社区提供的调试工具,同 GCC 配套组成了一套完整的开发环境,GDB 是 Linux 和许多 类Unix系统的标准开发环境。

一般来说,GDB 主要能够提供以下四个方面的帮助:

  • 启动程序,可以按照自定义的要求随心所欲的运行程序;
  • 可以让被调试的程序在所指定的设置的断点处停住(断点也可以是条件表达式);
  • 当程序被停住时,可以检查当前程序的中的变量的状态;
  • 可以修改程序,将一个 BUG 产生的影响修正从而测试其他BUG;

2.准备工作

通常,在为调试而编译时,我们需要关掉优化选项 -O ,并且打开调试选项 -g

另外,-Wall 会在尽量不影响程序行为的情况下选择打开所有的 warning ,也可以发现许多问题,可以避免一些不必要的 BUG。

gcc -g -Wall program.c -o program

-g 选项的作用是在可执行文件中加入源代码的信息,比如可执行文件中第几条机器指令对应源代码的第几行,但是并不是把整个源文件嵌入到可执行文件中,所以在调试的时候必须保证 GDB 能找到源文件

3.GDB命令——启动、退出、查看代码

使用如下的几个文件来测试:

main.c

#include <stdio.h>
#include <stdlib.h>

#include "head.h"

int main(int argc,char* argv[]){

    int a , b;
    if(argc < 3){
        a = 10 , b = 20;
    }
    else{
        a = atoi(argv[1]);
        b = atoi(argv[2]);
    }

    printf("a = %d , b = %d\n",a,b);
    printf("a + b = %d\n",add(a,b));
    printf("a - b = %d\n",sub(a,b));
    printf("a * b = %d\n",mul(a,b));
    printf("a / b = %.2lf\n",divide(a,b));
    printf("xixixiixixixi\n");

    printf("hello makefile\n");


    for(int i = 0;i < 20;i++){
        printf("%d ",i + 1);
    }
    printf("\n");

    return 0;
}

head.h

#include <stdio.h>

int add(int a,int b);

int sub(int a,int b);

int mul(int a,int b);

double divide(int a,int b);

add.c

#include "head.h"

int add(int a,int b){
    return a + b;
}

sub.c

#include "head.h"

int sub(int a,int b){
    return a - b;
}

mul.c

#include "head.h"

int mul(int a,int b){
    return a * b;
}

div.c

#include "head.h"

double divide(int a,int b){
    return a * 1.0 / b;
}

Makefile

src=$(wildcard *.c)
objs=$(patsubst %.c,%.o,$(src))

target=app

$(target):$(src)
	$(CC) $(src) -o $(target) -g


.PHONY:clean
clean:
	rm $(objs) -f

1.启动和退出

  • gdb 可执行文件;
  • quit / q

首先使用 make 生成带有调试信息的可执行程序 app,接着再使用 gdb 启动和退出。

在这里插入图片描述

2.给程序设置参数 / 获取参数

  • set args 10 20 ...
  • show args

在这里插入图片描述

3.GDB 使用帮助

  • help

在这里插入图片描述

4.查看当前文件代码

  • list / l (从默认位置开始显示);
  • list / l 行号 (从指定行开始显示,指定的行号在中间);
  • list/l 函数名 (从指定函数显示);

默认是从起始位置开始显示的。

在这里插入图片描述

显示第 20 行。

在这里插入图片描述
显示 main 函数。

在这里插入图片描述

5.设置显示的行数

  • show list / listsize
  • set list / listsize 行数

默认只显示 10 行。

将其修改为 20 行,再查看代码。

在这里插入图片描述

6.查看非当前文件的代码

  • list / l 文件名:行号
  • list / l 文件名:函数名

查看 add.c文件的第 5 行。

在这里插入图片描述

查看 sub.c 文件的 sub() 函数。

在这里插入图片描述

4.GDB命令——断点操作

1.设置断点

  • break / b 行号
  • break / b 函数名
  • break / b 文件名:行号
  • break / b 文件名:函数

默认文件第 10 行设置断点。

在这里插入图片描述

main 函数设置断点。

在这里插入图片描述

add,c 文件中,第 3 行设置断点。

在这里插入图片描述

sub.c 文件中,sub() 函数设置断点。

在这里插入图片描述

2.查看断点

  • info / i break / b

查看第一步设置的断点信息。

在这里插入图片描述

3.删除断点

  • delete / del / d 断点编号

删除编号为 3 的断点,也就是 add.c 第 3 行的断点。

在这里插入图片描述

4.设置断点无效

  • disable / dis 断点编号

将 1号断点设置为无效。

在这里插入图片描述

5.设置断点生效

  • enable / ena 断点编号

设置 1号断点 生效。

在这里插入图片描述

6.设置条件断点(一般用在循环体中)

  • break / b 行号 if i==5

main.c 的 28 行是一个循环,当 i ==10 时,给 28行 设置一个断点。

在这里插入图片描述

需要注意的是,当退出 gdb 之后,你之前设置的断点就都没有了。

5.GDB命令——调试命令

1.运行 GDB 程序

  • start (程序停在第一行);
  • run (遇到断点才停);

main.c 的 20行 设置一个断点。

start

在这里插入图片描述

run

在这里插入图片描述

2.继续运行,遇到下一个断点才停

  • continue / c

main.c 24行 再设置一个断点。

run 启动程序来到 20行。

在这里插入图片描述
接着再执行 continue / c 命令,就会来到下一个断点处,也就是 24行。

在这里插入图片描述

如果后面没有断点了,再执行 continue / c 命令,程序就会执行到最后,执行完毕。

在这里插入图片描述

3.向下执行一行代码(不会进入函数体)

  • next / n

4.变量操作

  • print 变量名 (打印变量的值);
  • ptype 变量名 (打印变量数据类型);

5.向下单步调试

  • step / s (会进入函数体);
  • finish (调出函数体);

6.自动变量操作

  • display num (自动打印指定变量 num 的值);
  • info / i display (显示有哪些自动变量);
  • undisplay 编号 (取消指定的自动变量);

7.其他操作

  • set var 变量名=变量值 (定义变量);
  • until (跳出循环);

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

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

相关文章

改进YOLOv8:结合ICCV2023|动态蛇形卷积,构建不规则目标识别网络

🔥🔥🔥 提升多尺度、不规则目标检测,创新提升 🔥🔥🔥 🔥🔥🔥 捕捉图像特征和处理复杂图像特征 🔥🔥🔥 👉👉👉: 本专栏包含大量的新设计的创新想法,包含详细的代码和说明,具备有效的创新组合,可以有效应用到改进创新当中 👉👉👉: �…

什么是稳定扩散,它是如何工作的?

推荐基于稳定扩散(stable diffusion) AI 模型开发的自动纹理工具&#xff1a; DreamTexture.js自动纹理化开发包 - NSDT 稳定扩散是潜在扩散模型的一个版本。潜在空间用于获得数据的低维表示的好处。之后&#xff0c;使用扩散模型和添加和去除噪声的方法根据文本生成图像。在接…

《红蓝攻防对抗实战》十.内网穿透之利用DNS协议进行隧道穿透

一.利用DNS协议进行隧道穿透 1.环境配置2.Windows系统下进行DNS隧道穿透利用3.Linux系统下进行DNS隧道穿透利用 前文推荐&#xff1a; 《红蓝攻防对抗实战》一. 隧道穿透技术详解 《红蓝攻防对抗实战》二.内网探测协议出网之TCP/UDP协议探测出网 《红蓝攻防对抗实战》三.内网…

抖音小程序开发:打造高效餐饮团购平台的技术指南

在餐饮行业&#xff0c;通过抖音小程序开发一个高效的团购平台&#xff0c;可以为餐厅提供更广泛的曝光&#xff0c;增加销售机会。本文将从技术角度出发&#xff0c;为您提供一份详细的抖音小程序开发指南&#xff0c;助您打造一流的餐饮团购平台。 一、确定需求和功能 在开…

LeetCode | 234. 回文链表

LeetCode | 234. 回文链表 O链接 这里的解法是先找到中间结点然后再将中间节点后面的节点逆序一下然后再从头开始和从中间开始挨个比较如果中间开始的指针到走最后都相等&#xff0c;就返回true&#xff0c;否则返回false 代码如下&#xff1a; struct ListNode* reverseLis…

只会CRUD程序员朋友,你开始拥抱云计算技术了吗

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概6000多字&#xff0c;预计阅读时间长需要6分钟。本篇文章的理论性较强&#xff0c;是一篇质量分数较高的技术文章&#xff0c;建议收藏…

11. EPIC定时器

11. EPIC定时器 EPIT定时器简介EPIT定时器结构分析EPIT 定时器相关寄存器EPITx_CREPITx_SREPITx_LR 加载寄存器EPITx_CMPR 比较寄存器EPITx_CNR 计数寄存器 EPIT 配置步骤 例程代码编写bsp_epittimer.hbsp_epittimer.cmain.c EPIT定时器简介 EPIT定时器是增强的周期中断定时器…

jupyter notebook中markdown改变图像大小

文章目录 &#x1f56e;原始图像&#x1f56e;改变图像大小&#x1f56e;使图像靠左 在 jupyter notebook中&#xff0c;导入的图片过大&#xff0c;想要改变图像的大小 &#x1f56e;原始图像 &#x1f56e;改变图像大小 复制小括号里面的内容到src后面&#xff0c;满足<…

【LeetCode】挑战100天 Day09(热题+面试经典150题)

【LeetCode】挑战100天 Day09&#xff08;热题面试经典150题&#xff09; 一、LeetCode介绍二、LeetCode 热题 HOT 100-112.1 题目2.2 题解 三、面试经典 150 题-113.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站&#xff0c;提供各种算法和数据结构的题目&…

【自定义类型:结构体】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 1. 结构体类型的声明 1.1 结构体的概念 1.2 结构的声明 ​编辑 1.3 特殊的声明 1.4 结构的自引用 2. 结构体变量的创建和初始化 3. 结构成员访问操作符 4. 结构体内…

学习linux必不可少的【yum命令】!

&#x1f4da;&#x1f4da; &#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Linux》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一…

【JavaEE初阶】 TCP滑动窗口与流量控制和拥塞控制

文章目录 &#x1f384;为什么出现滑动窗口&#x1f38b;滑动窗口丢包问题&#x1f6a9;情况一&#xff1a;数据包已经抵达&#xff0c;ACK被丢了。&#x1f6a9;情况二&#xff1a;数据包就直接丢了 &#x1f332;流量控制&#xff08;安全机制&#xff09;&#x1f333;拥塞控…

STM32F4X SDIO(九) 例程讲解-SD卡擦除、读写

STM32F4X SDIO &#xff08;九&#xff09; 例程讲解-SD卡擦除、读写 例程讲解-SD卡擦除、读写SD卡擦除CMD32:ERASE_WR_BLK_START命令发送命令响应 CMD33:ERASE_WR_BLK_END命令发送命令响应CMD38:ERASE命令响应 CMD13:SD_CMD_SEND_STATUS命令发送命令回应 SD卡读数据CMD16:SET_…

C++ 配合图形库实现画线效果

#include<stdio.h> #include <conio.h> #include<math.h> #include <graphics.h> // 引用图形库头文件 #define N 12 int List[N][N];void draw() {for (int i 0; i < N; i) {int x 200 * cos(2 * 3.14 * i / N);int y 200 * sin(2 * 3.1…

SwiftUI 如何保证 Text 中字符数量相等的字符串显示宽度一定相同?

0. 问题现象 在 SwiftUI 中我们往往需要将内容相似的字符串展列出来给用户比较,这些字符串内容各有不同但字符数量始终是相等的,我们希望它们的显示宽度始终保持一致: 如上图所示:即使是等宽字符组成的字符串在字符数量相等时它们的显示宽度仍然可能不一致。但演示中最底部…

抖音短视频账号矩阵系统、短视频矩阵源码+无人直播源码开发可打包

抖音短视频账号矩阵系统、短视频矩阵源码无人直播源码开发可打包 矩阵系统源码主要有三种框架&#xff1a;Spring、Struts和Hibernate。Spring框架是一个全栈式的Java应用程序开发框架&#xff0c;提供了IOC容器、AOP、事务管理等功能。Struts框架是一个MVC架构的Web应用程序框…

Raft分布式一致性算法

拜占庭将军 假设多位拜占庭将军中没有叛军&#xff0c;信使的信息可靠但有可能被暗杀的情况下&#xff0c;将军们如何达成是否要进攻的一致性决定&#xff1f;解决问题的思路是&#xff0c;从多位处于平等地位的将军中选举出一位大将军&#xff0c;所有作战指令由大将军发出。…

python升级pip的时候一直失败

如图,一直提示使用 python.exe -m pip install --upgrade pip 进行升级pip,但是执行这句命令又不成功.然后综合了几篇文章以后使用了下面的命令可以升级了 python -m pip install --upgrade pip --user -i https://mirrors.aliyun.com/pypi/simple/ 主要是在推荐的语句上使用…

解决内存泄漏问题,Profiler工具的使用介绍

什么是内存泄漏 内存泄漏&#xff08;Memory Leak&#xff09;是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放&#xff0c;造成系统内存的浪费&#xff0c;导致程序运行速度减慢甚至系统崩溃等严重后果。 以上是官方针对内存泄漏的说法。说的通俗一点&#x…

高频SQL50题(基础版)-3

文章目录 主要内容一.SQL练习题1.1174-即时食物配送代码如下&#xff08;示例&#xff09;: 2.550-游戏玩法分析代码如下&#xff08;示例&#xff09;: 3.2356-每位教师所教授的科目种类的数量代码如下&#xff08;示例&#xff09;: 4.1141-查询近30天活跃用户数代码如下&…