Linux调试器--gdb的介绍以及使用

在这里插入图片描述

文章目录

  • 1.前言 ✒️
  • 2.介绍gdb✒️
  • 3.Debug模式和Release模式的区别✒️
  • 4.如何使用gdb✒️
    • 1️⃣.在debug模式下编译
    • 2️⃣.进入调试
    • 3️⃣ .调试命令集合⭐️⭐️

1.前言 ✒️

🕗在我们之前的学习中已经学会了使用vim编译器编写c/c++代码,但是对于一个程序员来说,只会写代码还是不够的,我们还要学会debug.可以说debug能力是衡量一个程序员水平高低的关键因素。下面我们就来学习使用Linux中的调试器gdb吧!

2.介绍gdb✒️

🔎 GDB 是一个由 GNU 项目开发的强大的调试器,可用于调试多种编程语言的程序,包括 C、C++、Fortran等。它提供了一系列命令和功能,使开发者能够检查程序的执行状态、变量的值、堆栈跟踪,以及与程序的交互。GDB
是自由软件,支持多个平台和操作系统。

3.Debug模式和Release模式的区别✒️

🔎在软件开发中,通常有两种主要的构建模式:Debug 模式和 Release模式。这两种模式在编译和优化方面有一些显著的区别,以满足不同的开发和部署需求。通常来说,Release模式下会将代码进行各种优化和压缩,适合发布和部署。而Debug模式下编译代码则会生成调试信息,体积较大,执行速度较慢,但适合程序员调试
Linux gcc/g++出来的二进制程序,默认是release模式,要使用gdb调试,必须在源代码生成二进制程序的时候, 加上-g 选项(进入debug模式)

以下是Debug模式和Release模式的具体区别✒️:

Debug 模式:1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣
1️⃣.符号信息: Debug 模式保留了编译时的符号信息,这包括变量名、函数名、源代码行号等。这样,在调试期间可以准确地追踪代码执行路径。

2️⃣.优化级别低: 编译器通常会采用较低的优化级别,以确保生成的机器代码更容易理解和调试。这包括关闭一些优化选项,使得生成的代码更贴近源代码。

3️⃣.运行时检查: Debug 模式通常启用了各种运行时检查,如数组越界检查、空指针检查等。这些检查有助于捕获潜在的错误,但会降低程序的执行速度

4️⃣.可读性强: 生成的代码结构更接近源代码,易于阅读和理解。这有助于开发人员在调试期间准确定位和修复问题。

5️⃣.辅助工具: Debug 模式支持各种调试工具,如断点设置、单步执行、变量监视等。这些工具在调试阶段提供了更多的信息和控制权。

Release 模式:1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣
1️⃣.去除符号信息: Release 模式通常会剔除符号信息,以减小可执行文件的大小。这使得代码更难以反向工程,但也使得在运行时无法精确地映射回源代码。

2️⃣.高优化级别: 编译器在 Release 模式下通常采用更高的优化级别,以提高代码的执行效率。这包括诸如内联函数、循环展开等优化。

3️⃣.去除运行时检查: Release 模式通常禁用或减少运行时检查,以提高程序的性能。这可能包括禁用数组越界检查、空指针检查等。

4️⃣.代码压缩: 为了减小可执行文件的大小,Release 模式可能会使用更激进的代码压缩技术,如去除不必要的代码、数据、函数等。

5️⃣.最终产品Release 模式生成的可执行文件通常是最终产品,用于部署到生产环境。它旨在在生产环境中运行,并且不需要调试信息。

🔸对比两个模式下生成可执行文件的大小
在这里插入图片描述
🔸使用readelf -S test指令查看debug模式下生成可执行文件的调试信息
在这里插入图片描述

通过以上介绍两个模式的区别,我们可以很容易的知道为什么要在debug模式下才能去调试代码,下面我们再详细说明如何使用gdb

4.如何使用gdb✒️

1️⃣.在debug模式下编译

想调试代码首先需要在debug模式下编译代码并生成可执行文件:

g++ -o test test.cpp -g//-g 选项表示在debug模式下编译

2️⃣.进入调试

如果没有安装gdb可以使用yum指令先安装

yum install -y gdb

调试某个可执行文件test,如果test可执行文件不携带调试信息的话,使用调试命令就会出错

gdb test//test表示某个在debug模式下编译生成的可执行文件

在这里插入图片描述

3️⃣ .调试命令集合⭐️⭐️

成功进入调试窗口后,可以输入调试的命令,以下是常见调试命令集合:

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

在这里插入图片描述

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

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

相关文章

OpenCV 图像的几何变换

一、图像缩放 1.API cv2.resize(src, dsize, fx0,fy0,interpolation cv2.INTER_LINEAR) 参数: ①src :输入图像 ②dsize:绝对尺寸 ③fx,fy:相对尺寸 ④interpolation:插值方法 2.代码演示 import cv2 …

Python——读写属性

采用读写属性的目的就是把录入的数据控制在合理区间。 如:学生的年龄(age),学生的身高(height)... 方法一:利用实例方法来控制 class Student:def __init__(self,name"",age0):self.…

Linux:kubernetes(k8s)prestop事件的使用(10)

他的作用是在结束pod容器之后进行的操作 apiVersion: v1 # api文档版本 kind: Pod # 资源对象类型 metadata: # pod相关的元数据,用于描述pod的数据name: nginx-po # pod名称labels: # pod的标签type: app #这个是随便写的 自定义的标签version: 1.0.0 #这个…

PostgreSQL 安装部署

文章目录 一、PostgreSQL部署方式1.Yum方式部署2.RPM方式部署3.源码方式部署4.二进制方式部署5.Docker方式部署 二、PostgreSQL部署1.Yum方式部署1.1.部署数据库1.2.连接数据库 2.RPM方式部署2.1.部署数据库2.2.连接数据库 3.源码方式部署3.1.准备工作3.2.编译安装3.3.配置数据…

C语言 --- 指针(5)

目录 一.sizeof和strlen对比 1.sizeof 2.strlen 3.strlen 和sizeof的对比 二.数组和指针笔试题目详解 回顾:数组名的理解 1.一维数组 2.字符数组 代码1: 代码2: 代码3: 代码4: 代码5: 代码6&am…

SSM整合项目(使用Vue3 + Element-Plus创建项目基础页面)

1.配置Vue启动端口 1.修改vue.config.js const {defineConfig} require(vue/cli-service) module.exports defineConfig({transpileDependencies: true }) module.exports {devServer: {port: 9999 //启动端口} }2.启动 2.安装Element Plus 命令行输入 npm install eleme…

【leetcode热题】排序链表

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4]示例 2: 输入:head [-1,5,3,4,0] 输出:[-1,0,3,4,5]示例 3: 输入…

骑行瓦恭村的记忆

昆富公路是一条蜿蜒的丝带,引领着校长骑行这群热爱骑行的骑友,穿越时光的隧道,直达心灵深处那个被岁月抚摸得斑斑点点的小村庄——瓦恭村。大普吉隧道如同时光的门扉,每一次穿越,都伴随着轰鸣的排气扇声音,…

新规正式发布 | 百度深度参编《生成式人工智能服务安全基本要求》

2024年2月29日,全国网络安全标准化技术委员会( TC260 )正式发布《生成式人工智能服务安全基本要求》(以下简称《基本要求》)。《基本要求》规定了生成式人工智能服务在安全方面的基本要求,包括语料安全、模…

HarmonyOS 关系型数据 整体测试 进行 初始化 增删查改 操作

好啊 前面的文章 HarmonyOS 数据持久化 关系型数据库之 初始化操作 HarmonyOS 数据持久化 关系型数据库之 增删改逻辑编写 HarmonyOS 数据持久化 关系型数据库之 查询逻辑编写 我们分别编写了 初始化数据库表 增删查改操作 的逻辑代码 那么 下面我们就来整体操作一下 然后 这…

Python中的并发编程:多线程与多进程的比较【第124篇—多线程与多进程的比较】

Python中的并发编程:多线程与多进程的比较 在Python编程领域中,处理并发任务是提高程序性能的关键之一。本文将探讨Python中两种常见的并发编程方式:多线程和多进程,并比较它们的优劣之处。通过代码实例和详细的解析,…

Helix QAC—源码级静态自动化测试工具

Helix QAC概述 Helix QAC是一款源码级静态自动化测试工具,主要用于C/C代码的完全自动化静态分析工作,提供一个高效、健壮和自动化的环境来引入和执行编码标准。Helix QAC根据尽早、更频繁测试的理念,在软件生命周期最早期软件开发阶段应用识别…

Linux学习——线程的控制

目录 ​编辑 一,线程的创建 二,线程的退出 1,在子线程内return 2,使用pthread_exit(void*) 三,线程等待 四,线程获取自己的id值 五,线程取消 六,线程分离 一,线程的创建 在对…

JavaEE企业开发新技术2

目录 2.7 Field类的基本概念 文字性概念描述: Field类 2.8 Field的基本操作-1 2.9 Field的基本操作-2 分析: 2.10 Field 的综合练习 总结: 和equals的区别: 使用 比较 使用equals比较 2.7 Field类的基本概念 文字性…

IAR全面支持小华全系芯片,强化工控及汽车MCU生态圈

IAR Embedded Workbench for Arm已全面支持小华半导体系列芯片,加速高端工控MCU和车用MCU应用的安全开发 嵌入式开发软件和服务的全球领导者IAR与小华半导体有限公司(以下简称“小华半导体”)联合宣布,IAR Embedded Workbench fo…

微信小程序开发系列(二十四)·wxml语法·列表渲染·wx:for-item 和 wx:for-index

目录 1. 如果需要对默认的变量名和下标进行修改,可以使用wx:for-item 和 wx:for-index 2. 将 wx:for 用在 标签上,以渲染一个包含多个节点的结构块 方法一 方法二 3. 总结 3.1 wx:for-item 和 wx:for-index总结 3.2 总结 1. 如果需要对默…

简述epoll实现

所有学习笔记:https://github.com/Dusongg/StudyNotes 文章目录 epoll数据结构的选择?以tcp为例,网络io的可读可写如何判断?epoll如何做到线程安全?LT和ET如何实现?tcp状态和io的读写有哪些关系&#xff1…

ChatGPT等AI使用的过程苦笑不得瞬间

引言: 在人工智能的浪潮中,我们见证了技术的飞速发展和智能应用的广泛渗透。特别是随着语言模型的进步,AI如ChatGPT、文心一言、通义千问、讯飞星火等已经成为人们日常生活和工作中不可或缺的助手。然而,与任何新兴技术一样&#…

零售EDI:劳氏 Lowe‘s EDI项目案例

通过 EDI,企业与Lowes之间可以直接交换各种商业文档,如订单、发票、收据等,从而实现信息的实时交换,提高了供应链的效率和准确性。在现代供应链管理中,EDI 已经成为了不可或缺的重要工具。 作为一家拥有多条业务线的企…

力扣每日一题 找出数组的第 K 大和 小根堆 逆向思维(TODO:二分+暴搜)

Problem: 2386. 找出数组的第 K 大和 文章目录 思路复杂度💖 小根堆💖 TODO:二分 暴搜 思路 👨‍🏫 灵神题解 复杂度 时间复杂度: 添加时间复杂度, 示例: O ( n ) O(n) O(n) 空间复杂度: 添加空间复杂…