一步步教你使用GDB调试程序:从入门到精通的全面指南
文章目录
- Step1:安装GDB
- 1.1、包管理器安装
- 1.2、下载源码编译安装
- Step2:编译程序时添加调试信息
- Step3:GDB启动、退出、查看代码
- Step4:GDB断点操作
- Step5:GDB调试操作
- 5.1 单步调试
- 5.2 多进程调试
调试是软件开发中非常重要的一环,它可以帮助我们找到程序中的错误并修复它们。在Linux系统中,GDB是一个非常流行的调试工具,几乎每个开发者都会使用它来调试程序。本文将详细介绍如何使用GDB调试程序,如果你觉得内容对你有帮助,那么请不要忘记点赞和收藏,这将对我产生巨大的鼓励。让我们一起开始这段学习之旅吧!
Step1:安装GDB
1.1、包管理器安装
在Linux系统中,可以使用包管理器来安装GDB。例如,在Ubuntu系统中,可以使用以下命令来安装GDB:
sudo apt-get install gdb
1.2、下载源码编译安装
# 1. 打开终端,使用以下命令下载GDB源码压缩包到当前目录
wget http://ftp.gnu.org/gnu/gdb/gdb-9.2.tar.gz 或者 wget https://ftp.gnu.org/gnu/gdb/gdb-12.1.tar.xz# 2. 解压GDB源码压缩包到当前目录
tar -zxvf gdb-12.1.tar.xz# 3. 进入GDB源码目录
cd gdb-12.1# 4. 运行以下命令来配置GDB:这将在`/usr/local/gdb`目录下安装GDB,并启用系统读取行模式和禁用Guile语言
./configure --prefix=/usr/local/gdb --with-system-readline --without-guile# 5. 运行以下命令来编译GDB源代码并生成可执行文件
make # 6. 运行以下命令来安装GDB到系统中,并将其添加到系统路径中
sudo make install# 验证GDB是否成功安装:如果GDB成功安装,将输出GDB的版本信息
gdb --version
Step2:编译程序时添加调试信息
在编译程序时,需要使用-g选项来添加调试信息。例如,如果要编译名为test.c的程序,可以使用以下命令:
gcc -g -Wall test.c -o test
-g 的作用:在可执行文件中添加源代码信息,比如可执行文件第几条对应源码第几行
-Wall 的作用: 在不影响程序行为的情况下打开所有warning,发现更多的问题,避免不必要的BUG
这将生成一个带有调试信息的可执行文件test。
Step3:GDB启动、退出、查看代码
# 启动GDB并加载可执行文件
gdb test
# 退出
quit# GDB使用帮助
help# 给程序设置参数/获取设置参数
set args 10 20
show args# 查看当前文件代码
1ist/1 (从默认位置显示)
1ist/1 行号 (从指定的行显示)
list/1 函数名(从指定的函数显示)# 查看非当前文件代码
list/1 文件名:行号
list/1 文件名:函数名# 设置显示的行数
show list/listsize
set list/listsize 行数
Step4:GDB断点操作
# 设置断点,b或者break
b/break 行号
b/break 函数名
b/break 文件名:行号
b/break 文件名:函数# 查看断点,删除断点
i/info b/break
d/del/delete 断点编号# 设置断点无效和生效
dis/disable 断点编号
ena/enable 断点编号# 设置条件断点(一般用在循环的位置)
b/break 10 if i==5# 要查看当前作用域内的变量值,可以使用`print`命令。例如,要查看变量`x`的值,可以输入以下命令:
print x
Step5:GDB调试操作
5.1 单步调试
在GDB中,可以使用以下命令来单步执行程序:
# 运行gdB程序
start(程序停在第一行)
run(遇到断点才停)# 继续运行,到下一个断点停
c/continue# 向下执行一行代码(不会进入函数体)
n/next# 向下单步调试(遇到函数进入函数体)
s/step
finish(跳出函数体)# 变量操作
p/print变量名(打印变量值)
ptype 变量名(打印变量类型)# 自动变量操作
display num(自动打印指定变量的值)
i/info display
undisplay 编号# 其它操作
setvar变量名=变量值
until(跳出循环)
要查看当前的调用栈,可以使用backtrace命令。例如,要查看当前调用栈的详细信息,可以输入以下命令:
backtrace
5.2 多进程调试
使用GDB调试的时候,GDB默认只能跟踪一个进程,可以在fork函数调用之前,通过指令设置GDB调试工具跟踪父进程或者是跟踪子进程,默认跟踪父进程。
# 设置调试父进程或者子进程
set follow-fork-mode [parent(默认)| child]# 设置调试模式,默认为on,表示调试当前进程的时候其它的进程继续运行,如果为off,调试当前进程的时候其它进程被GDB挂起。
set detach-on-fork [on | off]# 查看调试的进程
info inferiors# 切换当前调试的进程
inferior id# 使进程脱离 GDB 调试
detach inferiors id
在这篇详尽的gdb教程的结尾部分,我真心希望大家能够点赞并收藏。这不仅是对我个人努力的认可,也是对我持续分享知识的热情的鼓励。每一个小小的赞和收藏都是对我最大的支持,让我有动力继续创作更多有价值的内容。让我们一起在学习和探索的道路上互相支持,共同进步!
相关文章:
一步步教你使用GDB调试程序:从入门到精通的全面指南
文章目录 Step1:安装GDB1.1、包管理器安装1.2、下载源码编译安装 Step2:编译程序时添加调试信息Step3:GDB启动、退出、查看代码Step4:GDB断点操作Step5:GDB调试操作5.1 单步调试5.2 多进程调试 调试是软件开发中非常重…...
OpenCV读取图像时按照BGR的顺序HWC排列,PyTorch按照RGB的顺序CHW排列
OpenCV读取RGB图像 在OpenCV中,读取的图片默认是HWC格式,即按照高度、宽度和通道数的顺序排列图像尺寸的格式。我们看最后一个维度是C,因此最小颗粒度是C。 例如,一张形状为2562563的RGB图像,在OpenCV中读取后的格式…...
基于安卓android微信小程序的校园维修平台
项目介绍 随着社会的发展,社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是采用java语言技术和mysql数据库来完成对系统的设计。整…...
mysql面试题16:说说分库与分表的设计?常用的分库分表中间件有哪些?分库分表可能遇到的问题有哪些?
该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说说分库与分表的设计? 在MySQL中,分库与分表是常用的数据库水平扩展技术,可以提高数据库的吞吐量和扩展性。下面将具体讲解MySQL中分库与分表…...
AlexNet网络复现
1. 引言 在现代计算机视觉领域,深度学习已经成为了一个核心技术,其影响力远超过了传统的图像处理方法。但深度学习,特别是卷积神经网络(CNN)在计算机视觉的主导地位并不是从一开始就有的。在2012年之前,计…...
pytorch模型量化和移植安卓详细教程
十一下雨,在家撸模型,希望对pytorch模型进行轻量化,间断摸索了几天,效果不错,做个总结分享出来。 量化是一种常见的技术,人们使用它来使模型在推断时运行更快,具有更低的内存占用和更低的功耗,而无需更改模型架构。在这篇博客文章中,我们将简要介绍量化是什么以及如何…...
C++(List)
本节目标: 1.list介绍及使用 2.list深度剖析及模拟实现 3.list和vector对比 1.list介绍及使用 1.1list介绍 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。 2. list的底层是双向链表结构,…...
分布式架构篇
1、微服务 微服务架构风格,就像是把一个单独的应用程序开发为一套小服务,每个服务运行在自己的进程中,并使用轻量级机制通信,通常是 HTTP API。这些服务围绕业务能力来构建,并通过完全自动化部署机制来独立部署。这些…...
ros编译报错-- Could NOT find ros_ethercat_eml (missing: ros_ethercat_eml_DIR)
– Could NOT find ros_ethercat_eml (missing: ros_ethercat_eml_DIR) – Could not find the required component ‘ros_ethercat_eml’. The following CMake error indicates that you either need to install the package with the same name or change your environment …...
VD6283TX环境光传感器驱动开发(3)----测试闪烁频率代码
VD6283TX环境光传感器驱动开发----3.测试闪烁频率代码 概述视频教学样品申请源码下载参考代码开发板设置测试结果 概述 ST提供了6283A1_AnalogFlicker代码在X-NUCLEO-6283A1获取闪烁频率,同时移植到VD6283TX-SATEL。 闪烁频率提取主要用于检测光源的闪烁频率&#…...
透明度和透明贴图制作玻璃水杯
1、什么是透明度 模型透明度是指一个物体或模型在呈现时的透明程度。它决定了物体在渲染时,是否显示其后面的物体或背景。 在图形渲染中,透明度通常以0到1之间的值表示。值为0表示完全透明,即物体不可见,背景或其他物体完全穿透…...
【前后缀技巧】2022牛客多校3 A
登录—专业IT笔试面试备考平台_牛客网 题意: 思路: 这种是典中典中典,对于gcd,背包问题都是一样的处理方式 预处理出前缀lca和后缀lca,枚举哪个消失即可,可以统计方案数 Code: #include &l…...
Ae 效果:CC Page Turn
扭曲/CC Page Turn Distort/CC Page Turn CC Page Turn (CC 翻页)主要用于模拟书页翻动的效果。通过使用该效果,用户可以创建出像书页或杂志页面翻动的视觉效果,增强影片的交互性和视觉吸引力。 ◆ ◆ ◆ 效果属性说明 Contro…...
【数据仓库设计基础(四)】数据仓库实施步骤
文章目录 1.定义范围2.确定需求3.逻辑设计1)建立需要的数据列表2)识别数据源3)制作实体关系图 4.物理设计1)性能优化2)数仓的拓展性 5.装载数据6.…...
GridSearchCV 工具介绍
目录 1、定义 2、工作流程 3、示例代码 4、总结 1、定义 GridSearchCV 是一个用于超参数调优的工具,它在给定的参数网格中执行交叉验证,以确定最佳的参数组合。通过穷举搜索(exhaustive search)来寻找最佳参数,即…...
基于 SSM 框架的旅游文化管理平台
本系统采用基于JAVA语言实现、架构模式选择B/S架构,Tomcat7.0及以上作为运行服务器支持,基于JAVA等主要技术和框架设计,idea作为开发环境,数据库采用MYSQL5.7以上。 开发环境: JDK版本:JDK1.8 服务器&…...
chatgpt技术总结(包括transformer,注意力机制,迁移学习,Ray,TensorFlow,Pytorch)
最近研读了一些技术大咖对chatgpt的技术研讨,结合自己的一些浅见,进行些许探讨。 我们惊讶的发现,chatgpt所使用的技术并没有惊天地泣鬼神的创新,它只是将过去的技术潜能结合现在的硬件最大化的发挥出来,也正因如此&am…...
vertx的学习总结4
一、异步数据和事件流 1.为什么流是事件之上的一个有用的抽象? 2.什么是背压,为什么它是异步生产者和消费者的基础? 3.如何从流解析协议数据? 1. 答:因为它能够将连续的事件序列化并按照顺序进行处理。通过将事件…...
SpringBoot心旅售票管理系统
本心旅售票管理系统采用基于JAVA语言实现、架构模式选择B/S架构,Tomcat7.0及以上作为运行服务器支持,基于JAVA、springboot、vue等主要技术和框架设计,idea作为开发环境,数据库采用MYSQL5.7以上。 采用技术: SpringBootVueMySQL...
CUDA C编程权威指南:1-基于CUDA的异构并行计算
什么是CUDA?CUDA(Compute Unified Device Architecture,统一计算设备架构)是NVIDIA(英伟达)提出的并行计算架构,结合了CPU和GPU的优点,主要用来处理密集型及并行计算。什么是异构计算࿱…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
