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

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

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

相关文章

GF0-57CQD-002 测量参数:加速度、速度、位移–现场可配置

GF0-57CQD-002 测量参数:加速度、速度、位移–现场可配置 GF0-57CQD-002 是一款创新的双通道变送器&#xff0c;专为精确的振动测量而设计。它激励并读取来自加速度计的信号&#xff0c;并将整体振动值作为电流/电压信号传输。它测量加速度、速度和位移等不同参数的振动。配置…

模电学习路径--google镜像chatgpt

交流通路实质 列出电路方程1&#xff0c;方程1对时刻t做微分 所得方程1‘ 即为 交流通路 方程1对时刻t做微分&#xff1a;两个不同时刻的方程1相减&#xff0c;并 令两时刻差为 无穷小 微分 改成 差 模电学习路径&#xff1a; 理论 《电路原理》清华大学 于歆杰 朱桂萍 陆文…

【数据结构】二叉树的遍历递归算法详解

二叉树的遍历 &#x1f4ab;二叉树的结点结构定义&#x1f4ab;创建一个二叉树结点&#x1f4ab;在主函数中手动创建一颗二叉树&#x1f4ab;二叉树的前序遍历&#x1f4ab;调用栈递归——实现前序遍历&#x1f4ab;递归实现中序和后序遍历 &#x1f4ab;二叉树的结点结构定义 …

稳定扩散AI 纹理生成器

推荐基于稳定扩散(stable diffusion) AI 模型开发的自动纹理工具&#xff1a; DreamTexture.js自动纹理化开发包 - NSDT 什么是稳定扩散&#xff1f; 从技术上讲&#xff0c;Stable Diffusion 是一种用于机器学习的潜在扩散模型 &#xff08;LDM&#xff09;。这种类型的专用深…

【dbeaver】添加mysql高低版本选择驱动

添加mysql高低版本选择驱动 连接到数据库->全部->查询mysql MySQL 版本驱动 8.0 MySQL 5 版本驱动 5.7.x 其他需要就&#xff1a;https://downloads.mysql.com/archives/c-j/ 密码查看 项目设置密码&#xff1a; File -> Project security ->设置密码 It i…

Ubuntu 22.04 安装水星无线 USB 网卡

我的 USB 网卡是水星 Mercury 的&#xff0c; 在 Ubuntu 22.04 下面没有自动识别。 没有无线网卡的时候只能用有线接到路由器上&#xff0c;非常不方便。 寻思着把无线网卡驱动装好。折腾了几个小时装好了驱动。 1.检查网卡类型 & 安装驱动 使用 lsusb 看到的不一定是准确…

法治智能起航 | 拓世法宝AI智慧政务一体机重塑法治格局,开启智能司法新篇章

在科技的巨轮推动下&#xff0c;我们的社会正快速迈向一个以数据和智能为核心的新时代。在这个波澜壮阔的变革中&#xff0c;人工智能&#xff08;AI&#xff09;显得尤为突出&#xff0c;它不仅是科技进步的象征&#xff0c;更是未来发展的助力者。 2023年&#xff0c;最高人…

医学影像系统源码(MRI、CT三维重建)

一、MRI概述 核磁共振成像&#xff08;英语&#xff1a;Nuclear Magnetic Resonance Imaging&#xff0c;简称NMRI&#xff09;&#xff0c;又称自旋成像&#xff08;英语&#xff1a;spin imaging&#xff09;&#xff0c;也称磁共振成像&#xff08;Magnetic Resonance Imag…

Labview利用声卡捕获波形

一般的计算机上自带的声卡&#xff0c;均既有A/D功能&#xff0c;又有D/A功能&#xff0c;就是一款具备基本配置的数据采集卡&#xff0c;并且技术成熟&#xff0c;性能稳定。 后台如下&#xff1a;

【Word自定义配置,超简单,图文并茂】自定义Word中的默认配置,比如标题大小与颜色(参考科研作图配色),正文字体等

▚ 01 自定义样式Styles中的默认标题模板 &#x1f4e2;自定义标题的显示效果&#xff0c;如下图所示&#xff1a; 1.1 自定义标题的模板Normal.dotm 1.1.1 选择所需修改的标题 新建一个空白Word文档&#xff0c;依次选择菜单栏的开始Home&#xff0c;样式Styles&#xff0c;…

光刻掩膜版怎么制作的?

光掩膜版基本上是 IC 设计的“主模板”。掩模版有不同的尺寸。常见尺寸为 6 x 6 英寸一般的掩膜版由石英或玻璃基板组成。光掩膜版涂有不透明薄膜。更复杂的掩模版使用其他材料。 一般来说&#xff0c;术语“photo mask”用于描述与 1X 步进机或光刻系统一起使用的“主模板”。…

Ubuntu 安装常见问题

1. 安装oh my zsh 搜狗输入法不能用 vim /etc/environmentexport XIM_PROGRAMfcitx export XIMfcitx export GTK_IM_MODULEfcitx export QT_IM_MODULEfcitx export XMODIFIERS“imfcitx” export LANG“zh_CN.UTF-8”配置完后重启&#xff0c;稍等一会&#xff0c;右上角会有个…

Windows下Python及Anaconda的安装与设置之保姆指南

学习Python编程需要安装基本的开发环境。 &#xff08;1&#xff09;python ——编译器&#xff1b;这个是任何语言都需要的&#xff1b;必需&#xff01; &#xff08;2&#xff09;Anaconda ——主要的辅助工具&#xff0c;号称是 Python‘OS&#xff1b;必需&#xff01; …

python机器学习——随机森林

随机森林 随机森林&#xff08;Random Forest&#xff09;是一种集成学习方法&#xff0c;它通过构建多个决策树并结合它们的预测结果来进行分类或回归。 算法原理&#xff1a; 决策树&#xff08;Decision Tree&#xff09;: 随机森林由多个决策树组成。决策树是一种基于树…

Pytorch实战教程(一)-神经网络与模型训练

0. 前言 人工神经网络 (Artificial Neural Network, ANN) 是一种监督学习算法,其灵感来自人类大脑的运作方式。类似于人脑中神经元连接和激活的方式,神经网络接受输入,通过某些函数在网络中进行传递,导致某些后续神经元被激活,从而产生输出。函数越复杂,网络对于输入的数…

云架构师学习------腾讯云通识-存储与数据库

云架构师学习------腾讯云通识-存储与数据库 云架构师学习------腾讯云通识-存储与数据库存储基础存储服务对象存储-COS产品概述功能概览产品优势 云硬盘-CBS产品概述产品功能产品优势云硬盘类型 文件存储-CFS产品概述产品功能产品优势文件存储类型及性能规格存储类型性能与规格…

图论09-桥和割点

文章目录 1 寻找桥的算法2 桥的代码实现3 寻找割点的算法4 割点的代码实现 1 寻找桥的算法 2 桥的代码实现 package Chapt06_Bridge;import java.util.ArrayList;public class FindBridges {private Graph G;private boolean[] visited;//ord数组记录访问的顺序private int or…

51单片机PCF8591数字电压表数码管显示设计( proteus仿真+程序+设计报告+讲解视频)

PCF8591数字电压表数码管显示 1.主要功能&#xff1a;讲解视频&#xff1a;2.仿真3. 程序代码4. 设计报告5. 设计资料内容清单&&下载链接资料下载链接&#xff08;可点击&#xff09;&#xff1a; 51单片机PCF8591数字电压表数码管设计( proteus仿真程序设计报告讲解视…

计蒜客详解合集(2)期

目录 T1126——单词倒排 T1617——地瓜烧 T1612——蒜头君的数字游戏 T1488——旋转单词 T1461——校验信用卡号码 T1437——最大值和次大值 T1126——单词倒排 超级水的一道题&#xff0c;和T1122类似但更简单&#xff0c;分割后逆序输出即可~ 编写程序&#xff0c;读入…

2023最新版本 从零基础入门C++与QT(学习笔记) -2- 命名空间的使用

&#x1f38f;在不同的命名空间变量名可相同 创建(如下方代码块) &#x1f384;分析一下构成 &#x1f388;-1- namespace 关键字命名空间 &#x1f388;-2- wm9 空间名称 &#x1f388;-3-括号里边正常定义变量即可 namespace wm9 {int a 99;char b A;float c 9.99;char…