Linux程序调试器——gdb的使用

news2025/1/15 23:48:12

gdb的概述

GDB 全称“GNU symbolic debugger”,从名称上不难看出,它诞生于 GNU 计划(同时诞生的还有 GCC、Emacs 等),是 Linux 下常用的程序调试器。发展至今,GDB 已经迭代了诸多个版本,当下的 GDB 支持调试多种编程语言编写的程序,包括 C、C++、Go、Objective-C、OpenCL、Ada 等。实际场景中,GDB 更常用来调试 C 和 C++ 程序。一般来说,GDB主要帮助我们完成以下四个方面的功能:

  1. 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
  2. 在某个指定的地方或条件下暂停程序。
  3. 当程序被停住时,可以检查此时你的程序中所发生的事。
  4. 在程序执行过程中修改程序中的变量或条件,将一个bug产生的影响修正从而测试其他bug。

背景

  • 程序的发布方式有两种,debug模式和release模式
  • Linux gcc/g++出来的二进制程序,默认是release模式
  • 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项

debug模式和release模式的区别

如果你想要让程序可以调试必须让其程序以debug模式进行发布。

像我们vs2022里面也是有这两种模式的,里面想要调试程序只需将其切换成debug模式方可调试

那么问题来了,一般我们的gdb进入的时候都有一个默认的模式,如何知道他是debug模式还是release模式呢?下面我们简单写一段代码来验证一下。

创建一个自动化构建工具Makefile文件

然后执行下make会自动编译形成一个可执行文件mycode,./mycode执行该程序是正常运行的。

在linux下,我们编译代码的时候,默认是release模式。如何证明呢?

我们上面说了,release模式下的程序是不可被调试的,我们只需要证明可执行程序mycode是不可被调试的即可。在linux下我们要证明一个程序是否能够被调试需要用到一个工具gdb。

以上是我的云服务器centos7下的gdb的版本,下面我们在该环境下进行使用测试

如果我们想让可执行程序mycode在gdb下被调试,只需要在gcc编译时加一个-g选项

下面我们重新编译下

如果你想要你的代码以debug 模式发布,必须给gcc添加-g选项

那么我们debug模式下形成的可执行程序和release模式下形成的可执行程序有什么区别呢?

其实debug 模式下形成的可执行程序 相对于release模式下形成的可执行程序加了一些调试信息

我们将mycode.c形成两个可执行程序一个是debug模式的,一个是release模式的

我们在Linux中形成的可执行程序格式是ELF格式的

所以我们可以通过readelf命令读取可执行文件的格式信息

开始使用

gdb binFile 退出: ctrl + d 或 quit 调试命令:

  • list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。

使用演示过程:

  • list/l 函数名:列出某个函数的源代码。

  • r或run:运行程序。

  • n 或 next:单条执行。

  • s或step:进入函数调用

  • break(b) 行号:在某一行设置断点

  • break 函数名:在某个函数开头设置断点

  • info break :查看断点信息。

  • finish:执行到当前函数返回,然后停下来等待命令

  • print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数

  • p 变量:打印变量值。

  • set var:修改变量的值

  • continue(或c):从当前位置开始连续而非单步执行程序

  • run(或r):从开始连续而非单步执行程序
  • delete breakpoints:删除所有断点
  • delete breakpoints n:删除序号为n的断点

  • disable breakpoints:禁用断点

  • enable breakpoints:启用断点
  • info(或i) breakpoints:参看当前设置了哪些断点

  • display 变量名:跟踪查看一个变量,每次停下来都显示它的值

  • undisplay:取消对先前设置的那些变量的跟踪

  • until X行号:跳至X行

  • breaktrace(或bt):查看各级函数调用及参数

  • info(i) locals:查看当前栈帧局部变量的值

  • quit:退出gdb

当你退出gdb的时候打的断点信息全部被清除

退出前:

退出后重新进入

如何理解gdb?

可以跟windows IDE对应,比如vs2022的调试

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

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

相关文章

C#上位机序列9: 批量读写+事件广播+数据类型处理

一、源码结构: 二、运行效果: 三、源码解析 1. 读取配置文件及创建变量信息(点位名称,地址,数据类型(bool/short/int/float/long/double)) 2. 异步任务处理:读任务&…

c++_learning-并发与多线程

并发与多线程 并发:进程:线程:基本概念:线程安全:问题出现的场景:涉及的性质:如何保证线程安全? 并发的实现手段(优先使用多线程并发):多进程并发…

【特征重要性揭秘:为什么同一个数据集会有不同结果】

文章目录 特征重要性概要为什么特征重要性分析很重要特征重要性分析方法内置特征重要性(coef_或feature_importances_)Leave-one-out相关性分析递归特征消除 Recursive Feature EliminationXGBoost特性重要性主成分分析 PCA方差分析 ANOVA卡方检验(Chi-Square Test&…

求最大公约数的几种常见的方法 【详解】

目录 一、关于公约数 二、计算最大公约数的方法 1. 辗转相除法(欧几里得算法) 2. 更相减损法(辗转相减法) 3. 分解质因数法 4. 穷举法 5. 递归法 6. 短除法 三、总结 一、关于公约数 首先 ,先介绍一下公约…

matplotlib python 画图教程(2)

1、bar 柱状图 import matplotlib.pyplot as plt import numpy as np n12 xnp.arange(12) y1(1-x/float(n))*np.random.uniform(0.5,1,n) y2(1-x/float(n))*np.random.uniform(0.5,1,n) plt.xlim(-.5,n) plt.ylim(-1.25,1.25) plt.xticks([]) plt.yticks([]) plt.bar(x,y1,fac…

利用TypeScript 和 jsdom 库实现自动化抓取数据

以下是一个使用 TypeScript 和 jsdom 库的下载器程序,用于下载zhihu的内容。此程序使用了 duoip.cn/get_proxy 这段代码。 import { JSDOM } from jsdom; import { getProxy } from https://www.duoip.cn/get_proxy;const zhihuUrl https://www.zhihu.com;(async (…

01、Python 安装 ,Pycharm 安装

目录 安装安装 Python安装 Pycharm 创建项目简单添加文件运行 简单爬取下载小视频 安装 python-3.8.10-amd64.exe – 先安装这个 pycharm-community-2022.2.exe 再安装这个 安装 Python python-3.8.10-amd64.exe 安装(这个是其他版本的安装,步骤一样…

Linux安装MINIO

MINIO简介MINIO目录 mkdir -p /opt/minio/data && cd /opt/minio MINIO下载 wget https://dl.minio.org.cn/server/minio/release/linux-amd64/minio MINIO授权 chmod x minio MINIO端口 firewall-cmd --zonepublic --add-port7171/tcp --permanent && firewal…

RTOS(6)任务管理

任务状态理论 我们是怎么实现,两个同优先级的任务之间交替执行的呢? 任务切换的基础:tick中断! tick为1ms一个周期,可以通过修改时钟配置修改; running:正在进行的任务3为running&#xff…

20231019 filezilla 配置 Windows与Ubuntu文件传输

SFTP协议,传文件,否则会报无权限错

RTOS(7)同步互斥与通信概述

同步与互斥 同步的例子 循环检测有缺陷,还是得blocked掉,不然会很占用cpu,浪费资源; 互斥的例子 单纯的使用全局变量来实现互斥不太靠谱,当执行时间过长的时候会概率性的出现错误 通信的例子 FreeRtos的解决方案 …

Linux操作系统从BIOS到bootloader是如何运行的

操作系统一般都会在安装在硬盘上,在 BIOS 的界面上。你会看到一个启动盘的选项。启动盘有什么特点呢?它一般在第一个扇区,占 512 字节,而且以 0xAA55 结束。这是一个约定,当满足这个条件的时候,就说明这是一…

浅谈轨道交通建筑能耗分析及节能措施

叶根胜 安科瑞电气股份有限公司 上海嘉定 201801 摘要:面对城市轨道交通的能耗增长,优化地铁车站建筑、降低运营能耗是促进公共交通可持续化发展的必经之路。通风空调系统的能耗占比较大,节能潜力也是大的。本文以上海首条绿色地铁的项目实…

C#计数排序算法

前言 计数排序是一种非比较性的排序算法,适用于排序一定范围内的整数。它的基本思想是通过统计每个元素的出现次数,然后根据元素的大小依次输出排序结果。 实现原理 首先找出待排序数组中的最大值max和最小值min。创建一个长度为max-min1的数组count&a…

售后服务管理升级要怎么做?如何用好售后工单管理系统?

随着数字经济的发展,市场服务趋于多样化,客户对售后服务也有更高的要求,市场竞争日益激烈,越来越多的供应商企业认识到单凭优异的质量,颇具竞争力的价格已不能保证企业的竞争优势,事实表明,用户…

[原创] ElasticSearch集群故障案例分析: 警惕通配符查询

[携程旅行网: 吴晓刚] 许多有RDBMS/SQL背景的开发者,在初次踏入ElasticSearch世界的时候,很容易就想到使用(Wildcard Query)来实现模糊查询(比如用户输入补全),因为这是和SQL里like操作最相似的查询方式,用…

常见面试题-Redis专栏(一)

typora-copy-images-to: imgs了解 redis 中的大key吗?多大算是大key呢?如何解决? 答: redis 的大 key 指的是 key 对应的 value 所占用的内存比较大。 对于 string 类型来说,一般情况下超过 10KB 则认为是大 key&…

waf、yakit和ssh免密登录

WAF安全狗 脏数据适用于所有漏洞绕过waf,但是前提条件垃圾信息必须放在危险信息前,是不能打断原有数据包的结构,不能影响后端对数据包的解析。 以DVWA靶场文件上传为例 新建php文件 上传文件被安全狗拦截 使用bp抓包查看 在数据包Content-…

Anomalib 图像异常检测算法

图像异常检测算法 1.简介1.1. 问题描述1.2. 挑战与需求 2. 图像异常检测定义2.1 异常的定义及类型2.2 图像数据中的异常 3. 图像异常检测技术研究现状4.方法5.安装和使用5.1 安装PyPI 安装本地安装 5.2 训练5.3 特征提取与(预训练)backones5.4 自定义数据…

DVWA-弱会话IDS

弱会话IDS Session简介: 用户登录后,在服务器就会创建一个会话(session),叫做会话控制,接着访问页面的时候就不用登录,只需要携带Session去访问即可。 sessionID作为特定用户访问站点所需要的唯一内容。如果能够计算…