Linux下的调试工具——GDB

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 (跳出循环);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FRI的Commit、Query以及FRI Batching内部机制

1. 引言 前序博客见&#xff1a; Reed-Solomon Codes及其与RISC Zero zkVM的关系RISC Zero ZKP协议中的商多项式 FRI用途&#xff1a; 用于证明某vector commitment是&#xff08;接近&#xff09;某Reed-Solomon codeword。即证明某low-degree多项式。 FRI工作原理&#…

时间序列预测实战(十二)DLinear模型实现滚动长期预测并可视化预测结果

官方论文地址->官方论文地址 官方代码地址->官方代码地址 个人修改代码->个人修改的代码已经上传CSDN免费下载 一、本文介绍 本文给大家带来是DLinear模型&#xff0c;DLinear是一种用于时间序列预测&#xff08;TSF&#xff09;的简单架构&#xff0c;DLinear的核…

uni-app点击按钮弹出提示框-uni.showModal(OBJECT),选择确定和取消

参考文档&#xff1a; https://uniapp.dcloud.io/api/ui/prompt?idshowmodal 显示模态弹窗&#xff0c;可以只有一个确定按钮&#xff0c;也可以同时有确定和取消按钮。类似于一个API整合了 html 中&#xff1a;alert、confirm。 uni.showModal({title: 提示,content: 这是一…

【计算机网络笔记】IP分片

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

openssl研发之base64编解码实例

一、base64编码介绍 Base64编码是一种将二进制数据转换成ASCII字符的编码方式。它主要用于在文本协议中传输二进制数据&#xff0c;例如电子邮件的附件、XML文档、JSON数据等。 Base64编码的特点如下&#xff1a; 字符集&#xff1a; Base64编码使用64个字符来表示二进制数据…

Leetcode刷题详解—— 目标和

1. 题目链接&#xff1a;494. 目标和 2. 题目描述&#xff1a; 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 或 - &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 &#xff1a; 例如&#xff0c;nums [2, 1] &#xff0c;可…

出电子书了!

熟悉小灰的小伙伴们都知道&#xff0c;小灰曾经创作了三本算法有关的图书&#xff0c;分别是《漫画算法》、《漫画算法Python篇》、《漫画算法2》。 如今&#xff0c;这三本书在全网的销量超过10W册&#xff0c;可以说是IT领域最畅销的图书之一。 小灰的这三本算法书&#xff0…

Linux系统编程,Linux中的文件读写文件描述符

文章目录 Linux系统编程&#xff0c;Linux中的文件读写操作1.open函数&#xff0c;打开文件 Linux系统编程&#xff0c;Linux中的文件读写操作 1.open函数&#xff0c;打开文件 我们来看下常用的open函数 这个函数最终返回一个文件描述符struct file 我们查看一下它的Ubuntu…

数据结构之双向链表

目录 引言 链表的分类 双向链表的结构 双向链表的实现 定义 创建新节点 初始化 打印 尾插 头插 判断链表是否为空 尾删 头删 查找与修改 指定插入 指定删除 销毁 顺序表和双向链表的优缺点分析 源代码 dlist.h dlist.c test.c 引言 数据结构…

LeetCode【923】三数之和的多种可能性

题目&#xff1a; 思路&#xff1a; https://www.jianshu.com/p/544cbb422300 代码&#xff1a; int threeSumMulti(vector<int>& A, int target) {//Leetcode923:三数之和的多钟可能//initialize some constint kMod 1e9 7;int kMax 100;//calculate frequenc…

图论12-无向带权图及实现

文章目录 带权图1.1带权图的实现1.2 完整代码 带权图 1.1带权图的实现 在无向无权图的基础上&#xff0c;增加边的权。 使用TreeMap存储边的权重。 遍历输入文件&#xff0c;创建TreeMap adj存储每个节点。每个输入的adj节点链接新的TreeMap&#xff0c;存储相邻的边和权重 …

138.随机链表的复制(LeetCode)

深拷贝&#xff0c;是指将该链表除了正常单链表的数值和next指针拷贝&#xff0c;再将random指针进行拷贝 想法一 先拷贝出一份链表&#xff0c;再对于每个节点的random指针&#xff0c;在原链表进行遍历&#xff0c;找到random指针的指向&#xff0c;最后完成拷贝链表random…

Java自学第10课:JavaBean和servlet基础

目录 目录 1 JavaBean &#xff08;1&#xff09;概念 &#xff08;2&#xff09;分类 &#xff08;3&#xff09;使用 2 servlet &#xff08;1&#xff09;代码结构 &#xff08;2&#xff09;常用接口 &#xff08;3&#xff09;如何开发 1 新建servlet 2 配置 1…

19 异步通知

一、异步通知 1. 异步通知简介 阻塞和非阻塞两种方式都是需要应用程序去主动查询设备的使用情况。 异步通知类似于驱动可以主动报告自己可以访问&#xff0c;应用程序获取信号后会从驱动设备中读取或写入数据。 异步通知最核心的就是信号&#xff1a; #define SIGHUP 1 /* 终…

C详细的字符串函数

但行前路&#xff0c;莫问归期 要注意的是&#xff0c;要使用下边所讲的函数要包含头文件<string.h> 文章目录 strlenstrcpystrncpy strcatstrncat strcmpstrncmp strstrstrtokstrerror字符串大小写转换struprstrlwr memcpymemmovememcmp strlen 求字符串的长度 函数参…

Typescript -尚硅谷

基础 1.ts是以js为基础构建的语言&#xff0c;是一个js的超集(对js进行了扩展)&#xff1b; 2.ts(type)最主要的功能是在js的基础上引入了类型的概念; Js的类型是只针对于值而言&#xff0c;ts的类型是针对于变量而言 Ts可以被编译成任意版本的js&#xff0c;从而进一步解决了…

MySQL Command Line Client 运行闪退问题解决,缺少my.ini文件

MySQL Command Line Client 运行闪退问题解决&#xff1a; 问题排查&#xff1a; 1.找到Command Line Client的路径位置&#xff0c;并查看属性&#xff0c;步骤截图&#xff1a; 查看属性&#xff1a; 查看属性中的目标路径&#xff1a; 2.进入属性中的目标路径&#xff0c;…

基于SSM+Vue的电子商城的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

记录--vue3 setup 中国省市区三级联动options最简洁写法,无需任何库

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 在写页面的时候&#xff0c;发现表单里面有一个省市区的 options 组件要写&#xff0c;因为表单很多地方都会用到这个地址选择&#xff0c;我便以为很简单嘛。 虽然很简单的一个功能&#xff0c;但是网…

C#中的扩展方法---Extension

C#中扩展方法是C# 3.0/.NET 3.x 新增特性&#xff0c;能够实现向现有类型中“添加”方法&#xff0c;以下主要介绍C#中扩展方法的声明及使用。 1、扩展方法的声明 扩展方法使能够向现有类型“添加”方法&#xff0c;而无需创建新的派生类型、重新编译或以其他方式修改原始类型…