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

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

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模式下编译
• 1

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


相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
3月前
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
62 10
|
3月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
|
3月前
|
NoSQL Linux 编译器
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
如何配置环境并使用QEMU虚拟机结合GDB进行Linux内核代码的断点调试,包括安装QEMU、交叉编译工具链,编译内核以及通过GDB远程连接进行调试的详细步骤。
135 0
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
|
5月前
|
NoSQL Linux C语言
GDB:强大的GNU调试器
GDB:强大的GNU调试器
|
5月前
|
NoSQL 编译器 Linux
【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用
【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用
83 0
|
6月前
|
NoSQL 搜索推荐 openCL
【C/C++ 调试 GDB指南 】gdb调试基本操作
【C/C++ 调试 GDB指南 】gdb调试基本操作
378 2
|
6月前
|
NoSQL Linux 开发工具
【深入解析git和gdb:版本控制与调试利器的终极指南】(下)
【深入解析git和gdb:版本控制与调试利器的终极指南】
|
3月前
|
NoSQL
技术分享:如何使用GDB调试不带调试信息的可执行程序
【8月更文挑战第27天】在软件开发和调试过程中,我们有时会遇到需要调试没有调试信息的可执行程序的情况。这可能是由于程序在编译时没有加入调试信息,或者调试信息被剥离了。然而,即使面对这样的挑战,GDB(GNU Debugger)仍然提供了一些方法和技术来帮助我们进行调试。以下将详细介绍如何使用GDB调试不带调试信息的可执行程序。
99 0
|
5月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
42 1
|
5月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
31 0