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

news2024/11/17 19:49:57
在这里插入图片描述

文章目录

  • 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.coloradmin.cn/o/1508209.html

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

相关文章

零基础自学C语言|自定义类型:结构体

✈结构体类型的声明 前面我们在学习操作符的时候,已经学习了结构体的知识,这里稍微复习一下。 🚀结构体回顾 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 🪂结构的声明 例如&a…

了解转义字符

了解转义字符 也许在前面的代码中你看到 \n , \0 很纳闷是啥。其实在字符中有⼀组特殊的字符是转义字符,转义字符顾名思义:转变原来的意思的字符。 比如:我们有字符 n ,在字符串中打印的时候自然能打印出这个字符,如下…

OpenCV 图像的几何变换

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

项目管理类,PMP和软考哪个更实用?

如果你想转变职业发展方向,那么请仔细考虑你的工作定位。对于项目管理而言,PMP考试是专门为项目管理人员设计的。而与项目管理相关的软考考试主要包括软考集成和高级。不过,软考更多地关注计算机技术和软件专业的认证。以下是我对PMP和软考两…

【Redis】 缓存双写一致性

缓存双写一致性 给缓存设置过期时间,定期清理缓存并回写,是保证最终一致性的解决方案。 我们可以对存入缓存的数据设置过期时间,所有的写操作以数据库为准,对缓存操作只是尽最大努力即可。也就是说如果数据库写成功,缓…

业界主流数据加速技术路线

计算存储分离已经成为云计算的一种发展趋势。在计算存储分离之前,普遍采用的是传统的计算存储相互融合的架构,但是这种架构存在一定的问题,比如在集群扩容的时候会面临计算能力和存储能力相互不匹配的问题。用户在某些情况下只需要扩容计算能…

编译支持国密的抓包工具 WireShark

目录 前言WireShark支持国密的 WireShark小结前言 在上一篇文章支持国密的 Web 服务器中,我们搭建了支持国密的 Web 服务器,但是,我们使用 360 安全浏览器去访问,却出现了错误: 是我们的 Web 服务器没有配置好?在这里插入图片描述还是 360 安全浏览器不支持国密?还是两…

pycharm手动安装常用插件

下载插件 (1)下载地址:JetBrains Marketplace 这里以语言包为例子 2、中文语言包 进入pycharm中的设置,点击plugins,选从磁盘中安装插件

分享axios+signalr简单封装示例

Ajax Axios Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。 从浏览器创建 XMLHttpReque…

最新基于R语言lavaan结构方程模型(SEM)技术

原文链接:最新基于R语言lavaan结构方程模型(SEM)技术https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247596681&idx4&sn08753dd4d3e7bc492d750c0f06bba1b2&chksmfa823b6ecdf5b278ca0b94213391b5a222d1776743609cd3d14…

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

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

在云端构建和部署工作负载的最佳方式是怎样的?

如果要问当今企业希望从云计算中获得什么,那么 “低延迟” 以及 “更接近客户” 可能会是很多企业的首要目标。低延迟可以带来诸多好处,如提升用户满意度、增加竞争优势、降低运营成本等;更接近客户则有助于降低网络拥塞、减少数据丢失、符合…

【算法】一类支持向量机OC-SVM

【算法】一类支持向量机OC-SVM 前言一类支持向量机OC-SVM 概念介绍示例编写数据集创建实现一类支持向量机OC-SVM完整的示例输出 前言 由于之前毕设期间主要的工具就是支持向量机,从基础的回归和分类到后来的优化,在接触到支持向量机还有一类支持向量机的…

可免费使用的AI平台汇总 + 常用赋能科研的AI工具推荐

赋能科研,AI工具助你飞跃学术巅峰!(推荐收藏) 文章目录 赋能科研,AI工具助你飞跃学术巅峰!(推荐收藏)一、可免费使用的AI平台汇总1. ChatGPT2. New Bing3. Slack4. POE5. Vercel6. 其他平台7. 特定功能平台8. 学术资源平台9. 中文…

Linux学习——线程的控制

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

MySQL常见的索引类型介绍

我将为您详细讲解 MySQL 中常见的索引类型,以及它们的使用场景、特点、区别和优势。索引是提高数据库查询性能的关键工具,它可以加速数据检索速度,减少服务器的负担。在 MySQL 中,索引类型主要包括 B-Tree 索引、哈希索引、全文索…

025—pandas 根多列判断不在其他列的数据

思路 是有两个相同结构的数据表,已知第二个表是第一个表的部分数据,需要以其中两列为单位,判断在第一个表中存在,在另外一个表中不存在的数据。 思路: 我们先将 df1 和 df2 的 x、y 列取出,组合为元组形成…

深入探索HAProxy:高性能负载均衡器的奥秘

目录 引言 一、HAProxy基础知识 (一)HAProxy概述 (二)核心特性 (三)支持调度算法 二、安装haproxy (一)下载源码包 (二)解决依赖环境 (三…

教你实现微信公众号消息每日自动推送-俘获妹子芳心

教你实现微信公众号消息每日自动推送-俘获妹子芳心,我们使用的是github的这个库。链接:https://github.com/limoest/daily_reminder 。作者的仓库已经有足够详细的教程。本文主要描述搭我自己的建过程,帮助更多小白一步一步搭建实现~ 首先要fork该项目 申请微信接口公众测试…

高端竞赛活动,财会知识竞赛复赛方案

复赛环节共计有48名选手参与,随机分为2组,每组24名选手,经过与预赛环节相同的关卡及赛制,即每组选手皆通过两轮关卡赛一轮复活赛,每组角逐12名选手晋级。2组共计24名选手晋级决赛,而未进入决赛的选手则获得…