Linux 调试器 GDB 使用指南
在Linux环境下开发和调试程序时,GNU调试器(GDB)是一个强大的工具。它支持多种编程语言(如C、C++、Fortran等),并且可以帮助开发人员检测、排除和修复程序中的错误。GDB能够让你在程序运行时暂停,查看内存和变量的状态,甚至修改程序的执行流程,是开发人员不可或缺的调试工具之一。
在本篇博客中,我们将详细介绍如何使用GDB进行调试,帮助你快速上手并掌握这款工具的基本功能。
一、GDB 简介
GDB(GNU Debugger)是GNU项目开发的一个功能强大的调试工具,常用于调试C/C++等编译型语言。通过GDB,你可以:
- 启动一个程序并指定其运行环境
- 在代码中设置断点,暂停程序的执行
- 逐行跟踪程序的执行
- 检查和修改程序的变量和内存
- 调试崩溃的程序(例如通过分析core dump文件)
GDB是一款命令行工具,但也可以和许多IDE集成,如Eclipse、VSCode等,提供图形化的调试界面。
二、安装 GDB
在大多数Linux发行版中,GDB默认已经包含在软件源中。你可以使用包管理工具来安装它。
对于基于Debian的系统(如Ubuntu):
sudo apt-get install gdb
对于基于Red Hat的系统(如CentOS):
sudo yum install gdb
安装完成后,你可以通过以下命令确认GDB是否安装成功:
gdb --version
三、GDB 调试基础
1. 编译程序
在使用GDB调试C或C++程序之前,首先要确保程序在编译时包含调试信息。通过编译时加上 -g
选项,可以生成可调试的可执行文件:
gcc -g -o myprogram myprogram.c
其中,-g
参数告诉编译器在生成的可执行文件中包含调试信息,这对于调试过程至关重要。
2. 启动 GDB
编译完成后,可以使用以下命令启动GDB并加载可执行文件:
gdb ./myprogram
进入GDB后,你会看到GDB的命令提示符 (gdb)
,你可以在这个环境中输入调试命令。
四、GDB 常用命令
1. 运行程序
在GDB中,使用 run
命令运行加载的程序:
(gdb) run
你还可以通过 run
命令传递命令行参数:
(gdb) run arg1 arg2
2. 设置断点
断点(Breakpoint)是调试时非常常用的功能,它可以让程序在执行到指定的行时暂停,方便你检查程序的状态。你可以通过以下命令在指定的行或函数处设置断点:
(gdb) break main # 在 main 函数处设置断点 (gdb) break 42 # 在第 42 行处设置断点
当程序执行到断点时,GDB会暂停程序的执行并返回调试控制权给用户。
3. 查看断点
你可以使用 info breakpoints
命令查看当前设置的所有断点:
(gdb) info breakpoints
4. 删除断点
使用 delete
命令删除特定的断点:
(gdb) delete 1 # 删除第一个断点
5. 逐行执行代码
当程序暂停时,可以通过以下命令逐行执行代码:
next
:执行当前行,并跳过函数调用step
:进入函数并逐行执行continue
:继续执行直到下一个断点finish
:运行完当前函数,返回调用函数
(gdb) next # 执行下一行,不进入函数 (gdb) step # 执行下一行,若遇到函数则进入该函数
6. 查看变量值
在调试时,检查变量的值是非常重要的。使用 print
命令可以查看指定变量的值:
(gdb) print myVar # 打印变量 myVar 的值 (gdb) print *p # 打印指针 p 指向的内存中的值
你还可以使用 display
命令自动显示每一步执行后的变量值:
(gdb) display myVar
7. 查看调用栈
在程序崩溃时,GDB可以帮助你查看函数的调用顺序。使用 backtrace
(或缩写 bt
)命令查看调用栈:
(gdb) backtrace
这可以显示出程序当前所在的函数以及是从哪些函数调用过来的。
8. 核心转储文件(Core Dump)
如果你的程序崩溃并生成了核心转储文件,你可以通过GDB来调试该崩溃。首先确保操作系统允许生成核心转储文件:
ulimit -c unlimited # 允许生成 core 文件
当程序崩溃时,会生成一个 core
文件。你可以使用GDB加载该文件进行调试:
gdb ./myprogram core
这样你就能查看导致程序崩溃的具体原因和代码位置。
五、GDB 调试技巧
1. 条件断点
有时候你可能希望程序在特定条件下才暂停执行。可以通过 condition
命令为断点设置条件:
(gdb) break 42 if myVar == 5
这表示程序只有在 myVar
等于 5 时才会在第 42 行处暂停。
2. 修改变量值
在程序暂停时,你可以通过 set
命令修改变量的值,从而改变程序的行为:
(gdb) set myVar = 10 # 将 myVar 的值设置为 10
3. 跳过某些代码
如果你不想执行某些代码,可以通过 jump
命令跳转到指定行:
(gdb) jump 50 # 跳转到第 50 行
六、总结
GDB 是 Linux 系统中功能强大的调试工具,适合用来调试 C/C++ 等程序语言。通过设置断点、逐步执行、查看变量和调用栈等功能,开发人员能够快速找到并修复代码中的错误。在实践中,熟练掌握GDB的基本功能和一些高级技巧,可以极大提高开发效率和代码质量。
希望这篇博客能够帮助你掌握GDB的使用方法,如果你有更多疑问或希望了解更高级的调试技巧,欢迎在评论区讨论!
相关文章:
Linux 调试器 GDB 使用指南
在Linux环境下开发和调试程序时,GNU调试器(GDB)是一个强大的工具。它支持多种编程语言(如C、C、Fortran等),并且可以帮助开发人员检测、排除和修复程序中的错误。GDB能够让你在程序运行时暂停,查…...

MiniCPM3-4B | 笔记本电脑运行端侧大模型OpenBMB/MiniCPM3-4B-GPTQ-Int4量化版 | PyCharm环境
MiniCPM3-4B,轻松在笔记本电脑上运行大模型? 背景一、选择模型二、模型下载三、模型运行四、总结 背景 2024年9月5日,面壁智能发布了MiniCPM3-4B,面壁的测试结果声称MiniCPM3-4B表现超越 Phi-3.5-mini-instruct 和 GPT-3.5-Turbo-…...

【chromedriver编译-绕过selenium机器人检测】
有小伙伴说使用selenium没能绕过机器人检测,盘他。 selenium机器人检测有2种,一是cdp检测,二是webdriver特征检测。cdp检测前面的博客已写过,这里就提下webdriver特征检测。一、selenium简介 Selenium 是一个强大的工具ÿ…...

【JavaEE精炼宝库】HTTP | HTTPS 协议详解
文章目录 一、HTTP 简介二、HTTP 协议格式:2.1 抓包工具的使用:2.2 HTTP 请求报文格式:2.3 HTTP 响应报文格式:2.4 HTTP 协议格式总结: 三、HTTP 请求详解:3.1 刨析 URL:3.2 方法(method)&#…...
Go语言基础学习01
目录 Linux环境下配置安装VScode并配置Go语言开发环境工作区和GOPATH 之前学习过Go语言,学习的时候没有记录笔记,最近找了个极客时间的Go语言36讲,打算时间学习并记录学习过程。 自己抽空看了一点内容,发现这个内容对于0基础解除G…...

基于SSM+Vue+MySQL的酒店管理系统
系统展示 用户前台界面 管理员后台界面 系统背景 随着旅游业的蓬勃发展,酒店业作为旅游产业链中的重要一环,面临着日益增长的客户需求和激烈的市场竞争。传统的人工酒店管理模式已难以满足高效、精准、个性化的服务要求。因此,开发一套基于SS…...
在WPF中保存控件内容为图片
在WPF中保存控件内容为图片 实现代码如下 1 private void SaveControlContentAsImage(FrameworkElement element,string fileName)2 {3 var render new RenderTargetBitmap((int)element.ActualWidth, (int)element.ActualHeight, 96, 96, PixelFormats…...
C#用SDK打开海康工业相机,callback取图Bitmap格式,并保存
上次写了python版本的,但是python虽好不方便发布,她带着重重的解释器有时候不方便玩耍.于是C#来了哦. C#图像一般用Bitmap表示,所以完全C#就够,别的格式可以自行想转换. 命令行哦,没界面. MVCamera.cs从MVS示例里面添加到项目中,using MvCamCtrl.NET; 就可以,不需要添加mvca…...
C语言字符学习初级优先看这个就够了
1. 字符的基本概念 在C语言中,字符(char)是一个基本的数据类型,用来表示单个字符。字符用单引号( )括起来,例如 a、1 等。字符在内存中实际上是以整数的形式存储的,即 ASCII 码。例…...
Python JSON
JSON 函数 json.dumps 语法 实例 json.loads 语法 实例 使用第三方库:Demjson 环境配置 JSON 函数 encode 语法 实例 decode 语法 实例 JSON 函数 使用 JSON 函数需要导入 json 库:import json。 函数描述json.dumps将 Python 对象编码…...

【华为杯】2024华为杯数模研赛F题 解题思路
题目 X射线脉冲星光子到达时间建模 问题背景 高速公路拥堵现象的原因众多,除了交通事故外,最典型的就是部分路段出现瓶颈现象,主要原因是车辆汇聚,而拥堵后又容易蔓延。高速公路一些特定的路段容易形成堵点,如匝道出…...
Object Pascal 结构化程序设计
Object Pascal 关系运算符 运算符名称等于<>不等于>大于<小于>大于等于<小于等于< (属于元素的)包含于> (属于元素的)包含in (属于元素的)属于 # Object Pascal 逻辑运算符 运算符名称含义Not逻辑非单目运算符,进行取反操作,由T…...

机器学习算法与实践_03概率论与贝叶斯算法笔记
1、概率论基础知识介绍 人工智能项目本质上是一个统计学项目,是通过对 样本 的分析,来评估/估计 总体 的情况,与数学知识相关联 高等数学 ——> 模型优化 概率论与数理统计 ——> 建模思想 线性代数 ——> 高性能计算 在机器学…...
如何使用Privoxy将SOCKS5代理转换为HTTP代理?
在这篇博客中,我将介绍如何使用Privoxy将SOCKS5代理转换为HTTP代理。我们将从下载和安装Privoxy开始,接着配置Privoxy,最后配置Windows以便浏览器使用该代理。 1. 下载并安装Privoxy 首先,您需要下载并安装Privoxy。您可以从Pri…...

AJAX(一)HTTP协议(请求响应报文),AJAX发送请求,请求问题处理
文章目录 一、AJAX二、HTTP协议1. 请求报文2. 响应报文 三、AJAX案例准备1. 安装node2. Express搭建服务器3. 安装nodemon实现自动重启 四、AJAX发送请求1. GET请求2. POST请求(1) 配置请求体(2) 配置请求头 3. 响应JSON数据的两种方式(1) 手动,JSON.parse()(2) 设置…...
Git进阶(十五):Git LFS 使用详解
文章目录 一、介绍二、Git LFS 使用步骤三、场景示例四、拓展阅读 一、介绍 Git LFS (Large File Storage) 是一个 Git 扩展,它使 Git 更适合处理大型文件,如音频、视频、图像或任何其他二进制大文件。Git LFS 替换仓库中的大文件为文本指针文件&#x…...

操作系统 | 学习笔记 | | 王道 | 5.1 I/O管理概述
5.1 I/O管理概述 5.1.1 I/O设备 注:块设备可以寻址,但是字符设备是不可寻址的 I/O设备是将数据输入到计算机中,或者可以接收计算机输出数据的外部设备,属于计算机中的硬件部件; 设备的分类 按使用特性分类ÿ…...
关于es的一个多集群、多索引切换的实现
首先是封装了一个类里定义了关于集群名称和集群节点;以及关于索引的名称和集群的名称做一个关联;将多个集群封装存储得到类中 /*** es集群类*/ Data public class EsClusterConfig implements Serializable {/*** 集群名称*/private String name;/*** 集…...

Linux系统编程(基础指令)上
1.Linux常见目录介绍 Linux目录为树形结构 /:根目录,一般根目录下只存放目录,在Linux下有且只有一个根目录。所有的东西都是从这里开始。当你在终端里输入“/home”,你其实是在告诉电脑,先从/(根目录&…...
【STM32 Blue Pill编程】-定时器PWM模式
定时器PWM模式 文章目录 定时器PWM模式1、定时器PWM模式介绍2、硬件准备及接线3、模块配置4、代码实现在文中,我们将介绍如何使用 STM32 Blue Pill 定时器的PWM模式以及如何配置它们以生成具有不同占空比和频率的信号。 我们将使用 LED调光器示例来演示如何使用 STM32Cube IDE…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...