Linux笔记---调试工具GDB(gdb)

1. gdb的概念

GDB,全称GNU Debugger,是一个功能强大的开源调试工具,广泛用于Unix和类Unix系统,以及Microsoft Windows和macOS平台。GDB允许开发者在程序执行过程中查看内部运行情况,帮助定位和修复程序中的错误。

gdb的主要功能:

  1. 启动和控制程序执行:gdb可以按照自定义要求运行程序,并在指定的断点处暂停执行。
  2. 检查程序状态:当程序暂停时,gdb允许开发者检查程序中发生的事情,包括变量的值、函数的调用堆栈等。
  3. 修改变量和程序执行流程:gdb允许开发者在调试过程中修改变量的值,甚至改变程序的执行路径,以测试不同的情景。

2. gdb的使用

我们知道,一个程序的代码可以编译出两个版本:release和debug。

在Linux中,我们使用gcc/g++来编译代码Linux笔记---gcc/g++与编译链接-CSDN博客。

当我们使用这两个工具来编译代码时,默认情况下编译出的是release版本,这个版本是无法被调试的。如果想使用gdb来调试我们的代码,需要在编译时带上 [-g] 选项,保留调试信息,生成debug版本的可执行程序。

在命令行输入下面的指令即可开始对可执行程序进行调试:

gdb [可执行程序名] # 注意是对可执行程序进行调试,而不是源代码

在接下来的介绍中,我们以下面这段代码为例:

#include <stdio.h>int Sum(int s, int e)
{int result = 0;for(int i = s; i <= e; i++){result += i;}return result;
}int main()
{int start = 1;int end = 100;printf("I will begin\n");int n = Sum(start, end);printf("running done, result is: [%d-%d]=%d\n", start, end, n);return 0;
}

2.1 cgdb

在Linux中,直接使用gdb来调试程序并不方便,无法做到像在vs中一样对代码进行实时的可视化调试,对程序运行的跟踪十分麻烦:

可以看到,在启动gdb对test程序进行调试时,页面中不会有任何的调试信息,要查看代码都只能通过 [l] 命令来一段一段地查看,就更别说指示当前代码执行到哪一行的箭头了。

所以,我们推荐使用基于gdb的调试工具cgdb来进行调试:

cgdb是一个基于文本的调试工具,它是gdb调试器的一个前端界面,旨在提供一个更加用户友好的调试环境。cgdb结合了gdb的强大调试功能和文本界面的简洁性,使得开发者可以在命令行环境中更高效地进行程序调试。

cgdb的使用方式,各种命令与gdb完全一致,但cgdb相比于gdb还具有以下特点和功能:

  1. 用户友好的界面:cgdb提供了一个分屏界面,上半部分显示源代码,下半部分显示gdb命令行界面,使得开发者可以同时查看代码和执行调试命令。
  2. 语法高亮:cgdb支持源代码的语法高亮,使得代码更易于阅读和理解。
  3. 自动完成:cgdb具有自动完成功能,可以帮助开发者更快地输入gdb命令。
  4. 历史命令记录:cgdb记录了之前执行过的命令,开发者可以方便地调用和重复执行这些命令。
  5. 断点管理:cgdb提供了直观的断点管理界面,使得开发者可以轻松地设置、删除和查看断点。
  6. 变量查看:cgdb允许开发者查看和修改变量的值,以及查看函数的调用堆栈。

cgdb的安装方式在不同的平台有所不同,在Ubuntu中可使用下面的命令来安装:

sudo apt-get install cgdb

使用cgdb再次尝试调试程序:

 可以看到,代码动态地展现在屏幕上半,绿色的箭头动态地对代码的执行进行跟踪,极大地方便了我们对代码进行调试。

接下来我们再详细介绍gdb中的各种指令,例如上图中在15行打上断点并让程序运行了起来。

2.2 控制执行的相关指令

命令作用示例
[run] / [r]从头开始连续执行程序,直到遇到断点或程序结束

[next] / [n]逐过程调试,等价于vs中的F10
[step] / [s]逐步调试,等价于vs中的F11
[finish]执行完当前函数
[set var] + [变量名]=[值]修改某变量的值set var i=10 --- 将i的值修改为10
[continue] / [c]从当前位置开始连续执行程序,直到遇到断点或程序结束
[until] + [行号n]执行到指定行until 20 --- 执行到第20行
[until] + [文件名]:[行号n]执行到指定文件的指定行until test.c:16 --- 执行到test.c的第16行
[quit] / [q]退出gdb/cgdb

2.3 查看信息的相关指令

命令作用示例
[list] / [l] + [行号n]显示第n行前后的源代码,每次显示10行l 25 --- 显示25行前后的源代码
[list] / [l] + [函数名]显示指定函数的源代码list main --- 显示main函数的源代码
[list] / [l] + [文件名]:[行号n]显示指定文件的第n行前后的源代码,每次显示10行,这里的文件指编译形成该可执行程序的源代码文件l test.c:15 --- 显示test.c第15行前后的源代码
[info] / [i] + [breakpoints] / [break] / [b]查看断点信息列表
[display] + [表达式]跟踪显示表达式的值(每次停止时显示一次)display a+b --- 每次停止时显示a+b的值
[undisplay] + [表达式序号]取消对指定序号表达式的跟踪显示undisplay 1 --- 取消对1号表达式的追踪显示
[backtrace] / [bt]查看当前执行栈的各级函数调用及参数
[info] / [i] + [locals]查看当前栈帧的局部变量
[print] / [p] + [表达式]打印指定表达式的值p a+b --- 打印a+b的值

2.4 断点的相关指令

命令作用示例
[break] / [b] + [行号n]在第n行打断点b 13 --- 在13行打断点
[break] / [b] + [函数名]在指定函数的第一行打断点b main --- 在main函数第一行打断点
[break] / [b] + [文件名]:[行号n]在指定文件的第n行打断点b test.c:17 --- 在test.c的第17行打断点
[delete] / [d] + [断点序号]删除指定序号的断点,不指定时默认删除全部断点d 1 --- 删除序号为1的断点
[delete] / [d] + [breakpoints]删除全部断点d breakpoints --- 删除全部断点
[disable] + [断点序号]禁用指定序号的断点,不指定时默认禁用全部断点disable 2 --- 禁用序号为2的断点
[enable] + [断点序号]启用指定序号的断点,不指定时默认启用全部断点enable 2 --- 启用序号为2的断点
[watch] + [表达式]监视某表达式,当表达式值发生变化时程序停止并显示变化前后的值(监视也是一种断点,删除方式与断点相同)watch a+b --- 监视a+b的值
 条件断点

顾名思义,条件断点就是在满足一定条件时断点才生效,断点信息列表中有相应的信息。

命令作用示例
[break] / [b] + [行号n] + [条件]在第n行打条件断点b 13 if result == 64 --- 在第13行打上条件断点,改断点只有在result == 64时才生效
[break] / [b] + [函数名] + [条件]在指定函数的第一行打条件断点
[break] / [b] + [文件名]:[行号n] + [条件]在指定文件的第n行打条件断点
[condition] + [断点序号] + [条件]给普通断点加上条件condition 2 result == 54 --- 给2号断点设置条件result == 54,使之成为条件断点

注意:在删除指定断点或取消跟踪时要使用序号,而不能使用行号或表达式。断点的行号可以使用 [info] + [b] 查看,表达式的序号会在显示其值时一并显示出来。 

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

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

相关文章

服务架构的演进:从单体到微服务的探索之旅

服务架构的演进&#xff1a;从单体到微服务的探索之旅 一 . 服务架构演变1.1 单体架构1.2 分布式架构1.3 微服务1.4 小结 二 . 微服务技术对比2.1 微服务系统架构图2.2 微服务技术对比2.3 企业需求 三 . Spring Cloud 随着企业业务的不断拓展和复杂度的提升&#xff0c;对软件系…

【论文笔记】LLaMA-VID: An Image is Worth 2 Tokens in Large Language Models

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: LLaMA-VID: An Image is W…

leetcode_二叉树最大深度

对二叉树的理解 对递归调用的理解 对内存分配的理解 基础数据结构&#xff08;C版本&#xff09; - 飞书云文档 每次函数的调用 都会进行一次新的栈内存分配 所以lmax和rmax的值不会混在一起 /*** Definition for a binary tree node.* struct TreeNode {* int val;* …

【模拟仿真】基于区间观测器的故障诊断与容错控制

摘要 本文提出了一种基于区间观测器的故障诊断与容错控制方法。该方法通过构建区间观测器&#xff0c;实现对系统状态的上下边界估计&#xff0c;从而在存在不确定性和外部噪声的情况下进行高效的故障诊断。进一步地&#xff0c;本文设计了一种容错控制策略&#xff0c;以保证…

Ubuntu24.04LTS在线安装Docker引擎

Ubuntu24.04LTS在线安装Docker引擎 文章目录 Ubuntu24.04LTS在线安装Docker引擎1. 官网教程2. 安装Docker引擎1. 卸载旧版本2. 使用存储库apt安装1. 设置Docker的APT仓库(官网)2. 设置Docker的APT仓库(阿里云-推荐) 3. 安装1. 安装最新版2. 安装指定的版本 1. 官网教程 官网安…

directed-map cache简单示例

这张图的地址映射是基于直接映射缓存的策略进行的&#xff0c;以下是详细解释&#xff1a; 直接映射缓存的映射方式 缓存块号 (Cache Block Number): 使用公式 Cache块号 主存块号 % 缓存块总数 来决定主存地址在哪个缓存块中存储。比如&#xff0c;这里 Cache块总数 4&#…

SpringBoot配置相关的内容

依赖Starter和Parent 查依赖坐标网站&#xff1a;Maven Repository: Search/Browse/Explorehttps://mvnrepository.com/ 设置配置文件 配置文件相关的配置 yml多个数据的书写 配置文件的读取

基于Python的仓库管理系统设计与实现

背景&#xff1a; 基于Python的仓库管理系统功能介绍 本仓库管理系统采用Python语言开发&#xff0c;利用Django框架和MySQL数据库&#xff0c;实现了高效、便捷的仓库管理功能。 用户管理&#xff1a; 支持员工和管理员角色的管理。 用户注册、登录和权限分配功能&#x…

使用tauri + naiveAdmin 构建桌面应用程序

非常好的如何部署naiveAdmin的文档笔记: 非常详细的 https://sx-code.github.io/wiki/adminpro/02_project_prepare/04_%E9%A1%B9%E7%9B%AE%E8%AE%BE%E7%BD%AE.html 阅读原码ing 前端框架 NaiveUiAdmin Rust 数据处理 ing … Mysql 数据库使用 ing …

RGB与YCbCr转换算法

目录 RGB与YCbCr转换算法RGB与YCbCr色域介绍RGB模型YCbCr色域简介YCbCr的应用YUV 和 YCbCr 的区别 色彩转换公式 RGB 转 YCbCr 实现RGB 转 YCbCr 的 Matlab 实现RGB 转 YCbCr 的 FPGA 实现 YCbCr 转 RGB 实现YCbCr 转 RGB 的 Matlab 实现YCbCr 转 RGB 的 FPGA 实现 RGB与YCbCr转…

【STM32】I2C通信协议

文章目录 I2C通信协议简介I2C协议硬件规定I2C协议软件规定I2C时序基本单元I2C典型时序 参考 STM32硬件I2C与软件模拟I2C超详解 I2C通信协议简介 I2C 也叫 IC、IIC (Inter-Integrated Circuit) &#xff0c;集成电路总线是由 Phiilps 公司开发的两线式串行总线&#xff0c;用于…

大数据挖掘

大数据挖掘 数据挖掘 数据挖掘定义 技术层面&#xff1a; 数据挖掘就是从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中&#xff0c;提取隐含在其中、人们事先不知道的、但又潜在有用的信息的过程。 数据准备环节 数据选择 质量分析 数据预处理 数据仓库 …

leetcode101:对称二叉树

给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false提示&#xff1a; 树中节点数目在范围…

湘潭大学软件工程算法设计与分析考试复习笔记(一)

文章目录 前言随机类&#xff08;第七章&#xff09;随机概述数值随机化舍伍德拉斯维加斯蒙特卡罗 模拟退火遗传人工神经网络 回溯&#xff08;第五章&#xff09;动态规划&#xff08;第四章&#xff09;后记 前言 考试还剩十一天&#xff0c;现在准备开始复习这门课了。好像全…

Win11专业版Docker安装、配置记录

零&#xff0c;系统环境配置 首先&#xff0c;安装Docker需要系统支持开启硬件虚拟化及Hyper-V功能&#xff0c;所以这里需要Win10/11的专业版&#xff0c;这样才能进行Docker for Windows软件安装。 1&#xff0c;硬件虚拟化 至于如何开启硬件虚拟化&#xff0c;自行百度即…

【Android】线程池的初见

引言 在Android当中根据用途分为主线程与子线程&#xff0c;主线程当中主要处理与界面相关的操作&#xff0c;子线程主要进行耗时操作。除了Thread本身以外&#xff0c;在Android当中还有很多扮演者线程的角色&#xff0c;比如AsyncTask&#xff08; 底层为线程池&#xff0c;…

春秋云镜-2022网鼎杯

flag1 进入网站&#xff0c;发现是wordpress&#xff0c;这种一般都不会有啥直接漏洞&#xff0c;应该是插件漏洞&#xff0c;或者弱口令 fscan扫描ip 好像没扫出啥东西 wp-login进入后台 爆破密码&#xff0c;弱口令admin&#xff0c;123456&#xff0c;之前lazysysadmin好…

js ResizeObserver API

一、ResizeObserver 是什么 ResizeObserver 是一个浏览器提供的 JavaScript API&#xff0c;用于监测一个元素的大小变化。它可以帮助开发者在元素的宽度或高度发生改变时执行某些操作&#xff0c;比如调整布局、重新渲染内容等。 二、Resize Observer和监听resize的区别及其…

《探索Zynq MPSoC》学习笔记(三)

引言&#xff1a;本文简要介绍FPGA器件技术发展以及当今FPGA器件的体系架构和特性。 第二章 FPGA、Zynq和Zynq MPSoC&#xff08;2&#xff09; 在本章涵盖的三种器件类型中&#xff0c;FPGA是建立时间最长的&#xff0c;也是Zynq和Zynq MPSoC器件PL元件的基础。因此&#xf…

支持用户注册和登录、发布动态、点赞、评论、私信等功能的社交媒体平台创建!!!

需要整体源代码的可以在我的代码仓下载https://gitcode.com/speaking_me/social-media-platformTest.git 社交媒体平台 描述&#xff1a;社交媒体平台需要支持用户注册、发布动态、点赞、评论、私信等功能。 技术栈&#xff1a; 前端&#xff1a;React, Angular, Vue.js后端…