【Linux】gdb工具,Linux 下程序调试的 “透视眼”
目录
- 调试代码
- 调试注意事项
- gdb和Cgdb
- 调试命令汇总
- 行号显示
- 断点设置
- 查看断点信息
- 删除断点
- 开启 / 禁用断点
- 运行 / 调试
- 逐过程和逐语句
- 打印 / 追踪变量
- 指定行号跳转
- 强制执行函数
- 补充命令
- watch
- set var 替换变量值
- 条件断点
- end
调试代码
- 这是本次调试要用的代码
1 #include <stdio.h>2 3 int AddToTop(int top)4 {5 printf("Enter AddToTop\n");6 7 int count = 0;8 for(int i = 1;i <= top; ++i)9 {10 count += i;11 }12 13 printf("Quit AddToTop\n"); 14 return count;15 }16 17 int main(void)18 {19 int top = 100;20 int ret = AddToTop(top);21 22 printf("ret = %d\n", ret);23 return 0;24 }
- 下面是Makefile中的内容,用于自动化编译
1 mytest:test.c 2 gcc test.c -o mytest -std=c99 -g 3 .PHONY:clean4 clean:5 rm -rf mytest
- 注:-std=c99表示以c99的标准来编译代码
调试注意事项
其实对于我们刚才直接make自动化生成的可执行程序是通过gcc直接编译产生得到的,它是一个【Release】版本的可执行程序,因此无法进行调试
- 但若是我们想要去生成一个【DeBug】版本的可执行程序也是可以的,只需要修改一下我们的Makefile即可,gcc后面带上一个-g的命令选项,此时再去make一下的话生成的就是【DeBug】版本的了, 我们才能进行调试给
gdb和Cgdb
- 这篇文章我们以Cgdb的形式演示命令,我也更推荐大家去用cgdb,他和gdb的功能是一样的,而且cgdb是可以在上面直接看到代码的,比gdb要方便很多。
- 指令:cgdb 可执行程序名 (一定要注意是可执行程序文件)
调试命令汇总
- 因为这个调试器是在Linux环境下的,是纯命令行模式,所以会有很多的指令,做好心里准备😢
注:()括号里面是该指令的全称
l(list) 行号/函数名 —— 显示对应的code,每次10行
r(run) —— F5【无断点直接运行、有断点从第一个断点处开始运行】b(breakpoint) + 行号 —— 在那一行打断点
b 源文件:函数名 —— 在该函数的第一行打上断点
b 源文件:行号 —— 在该源文件中的这行加上一个断点吧
info b —— 查看断点的信息
breakpoint already hit 1 time【此断点被命中一次】
d(delete) + 当前要删除断点的编号 —— 删除一个断点【不可以d + 行号】
若当前没有跳出过gdb,则断点的编号会持续累加 d + breakpoints —— 删除所有的断点
disable b(breakpoints) —— 使所有断点无效【默认缺省】
enable b(breakpoints) —— 使所有断点有效【默认缺省】
disable b(breakpoint) + 编号 —— 使一个断点无效【禁用断点】
enable b(breakpoint) + 编号 —— 使一个断点有效【开启断点】
相当于VS中的空断点 enable breakpount —— 使一个断点有效【开启断电】
n(next) —— 逐过程【相当于F10,为了查找是哪个函数出错了】
s(step) —— 逐语句【相当于F11,】
bt —— 看到底层函数调用的过程【函数压栈】
set var —— 修改变量的值
p(print) 变量名 —— 打印变量值
display —— 跟踪查看一个变量,每次停下来都显示它的值【变量/结构体…】
undisplay + 变量名编号 —— 取消对先前设置的那些变量的跟踪
排查问题三剑客🗡
until + 行号 —— 进行指定位置跳转,执行完区间代码 finish —— 在一个函数内部,执行到当前函数返回,然后停下来等待命令
c(continue) —— 从一个断点处,直接运行至下一个断点处【VS下不断按F5】
行号显示
- l(list) 行号/函数名 —— 显示对应的code,每次10行
- 首先若是直接【L】的话便会随机显示出该源文件中的随机10行内容,这不是我们想要的
若是【L 0】或者是【L 1】的话那就是从第一行开始往下列10行的内容
断点设置
- b + 行号 —— 在那一行打断点
- b 源文件:函数名 —— 在该函数的第一行打上断点
- b 源文件:行号 —— 在该源文件中的这行加上一个断点
查看断点信息
- info b —— 查看断点的信息
- 若是我们查看一下所打的断点的信息,那就在后面加个b/breakpoint
删除断点
- d + 当前要删除断点的编号 —— 删除一个断点【不可以d + 行号】
- d + breakpoints —— 删除所有的断点
开启 / 禁用断点
- disable b(breakpoints) —— 使所有断点无效【默认缺省】
- enable b(breakpoints) —— 使所有断点有效【默认缺省】
- disable b(breakpoint) + 编号 —— 使一个断点无效【禁用断点】
- enable b(breakpoint) + 编号 —— 使一个断点有效【开启断点】
运行 / 调试
- r(run) —— F5【无断点直接运行、有断点从第一个断点处开始运行】
- 再加上断点去运行的话就会在打的断点处停下来
逐过程和逐语句
- n(next) —— 逐过程【相当于F10,为了查找是哪个函数出错了】
- s(step) —— 逐语句【相当于F11,一次走一条代码,可进入函数,同样的库函数也会进入】
打印 / 追踪变量
p(print) 变量名 —— 打印变量值
- 都执行了那么多次了,不知道【i】和【count】发生了怎样的变化,将它们打印出来看看吧💻
- 通过继续执行【n】,然后再去打印就可以发现i的值和count的值发生了变化
但是你不觉得这样每次去打印会显得很繁琐吗,那一定会的,所以我们有更好的办法💡
- display —— 跟踪查看一个变量,每次停下来都显示它的值【变量/结构体…】
- undisplay + 变量名编号 —— 取消对先前设置的那些变量的跟踪
指定行号跳转
- until + 行号 —— 进行指定位置跳转,执行完区间代码
- 可以看到,当前在for循环内容执行累加的逻辑,但若是我们一直这么执行下去,就没有时间排错了,除了上面的哪一种【set var】之外,还有一种方法其实起到直接结束当前循环的作用,那就是进行指定行号跳转
- 通过观察下图可以看到,当我们运行了until 13之后,程序直接就给出了我们最终的结果count,而且即将要执行最后的打印语句,说明我们跳转成功了
- 但是注意的是,until并不能跳过断点,如果我们跳过的语句中有断点,until是会听在断点哪里的
强制执行函数
- finish —— 在一个函数内部,执行到当前函数返回,然后停下来等待命令
- 有时候我们会有这样的需求,在初步排查的时候推断可能是某个函数内部的逻辑出了问题,但是呢又不想一步步地进到函数内部进行调试,在VS中其实很简单,只需要在函数下方设个断点,然后F5直接运行到断点处即可
补充命令
watch
- 执⾏时监视⼀个表达式(如变量)的值。如果监视的表达式在程序运⾏期间的值发⽣变化,GDB 会暂停程序的执⾏,并通知使⽤者
- 如果你有⼀些变量不应该修改,但是你怀疑它修改导致了问题,你可以watch它,如果变
化了,就会通知你.
set var 替换变量值
- 对于这个修改变量的值,很像是在VS里调试之前设置的那种条件断点,可以使调试开始后直接运行到此断点处。不过对于【set var】而言是在调试过程中进行设置
条件断点
end
感谢大家的阅读,希望对你有帮助,谢谢
相关文章:
【Linux】gdb工具,Linux 下程序调试的 “透视眼”
目录 调试代码调试注意事项gdb和Cgdb调试命令汇总行号显示断点设置查看断点信息删除断点开启 / 禁用断点运行 / 调试逐过程和逐语句打印 / 追踪变量指定行号跳转强制执行函数 补充命令watchset var 替换变量值条件断点 end 调试代码 这是本次调试要用的代码 1 #include <st…...
脚本分享:快速作图对比wannier拟合能带python脚本
本脚本通过Python实现电子能带结构数据的快速作图,能够从两个不同的数据文件(BAND.dat 和 wannier90_band.dat)中提取有效数据,并在同一坐标系下绘制对比图。 准备工作:使用VASPKIT处理获得能带数据BAND.datÿ…...
解决ssh拉取服务器数据,要多次输入密码的问题
问题在于,每次循环调用 rsync 都是新开一个连接,所以每次都需要输入一次密码。为了只输入一次密码,有以下几种方式可以解决: ✅ 推荐方案:设置 SSH 免密登录 最稳最安全的方式是:配置 SSH 免密登录&#x…...
金仓数据库 KingbaseES 产品深度优化提案:迈向卓越的全面升级
文章目录 一、引言二、性能优化(一)查询性能提升1. 优化查询优化器引入基于代价的查询优化算法支持更多的查询优化提示 2. 索引优化支持更多类型的索引优化索引的创建和维护策略 (二)并发处理能力增强1. 锁机制优化采用更细粒度的…...
企业级智能合同管理解决方案升级报告:道本科技携手DeepSeek打造智能合同管理新标杆
当传统合同管理系统还在与堆积如山的纸质文档较劲时,道本科技与DeepSeek联合开发的智能合同平台已为国央企打开新视界。我们以某大型能源集团的实际应用为例,带您直观感受技术升级带来的管理变革。 一、技术升级的具象化呈现 在未接入DeepSeek技术前&a…...
C#并行编程极大提升集合处理速度,再也没人敢说你程序性能差了!
马工撰写的年入30万C#上位机项目实战必备教程(点击下方链接即可访问文章目录) 1、《C#串口通信从入门到精通》 2、《C#与PLC通信从入门到精通 》 3、《C# Modbus通信从入门到精通》 4、《C#Socket通信从入门到精通 》 5、《C# MES通信从入门到精通》 6、…...
[贪心_7] 最优除法 | 跳跃游戏 II | 加油站
目录 1.最优除法 题解 2.跳跃游戏 II 题解 3.加油站 题解 利用 单调性,可以实现 区间跳跃 1.最优除法 链接: 553. 最优除法 给定一正整数数组 nums,nums 中的相邻整数将进行浮点除法。 例如,nums [2,3,4],我…...
【Rust】Rust中的枚举与模式匹配,原理解析与应用实战
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
【CUDA 编译 bug】ld: cannot find -lcudart
我们使用 Conda 安装 pytorch 和 CUDA 环境之后,要用 Conda 的CUDA环境进行某个库编译时,出现了bug: /mnt/data/home/xxxx/miniforge3/envs/GAGAvatar/compiler_compat/ld: cannot find -lcudart: No such file or directorycollect2: error…...
MYSQL之数据类型
数据类型分类 数值类型 在MySQL中, 整型可以指定是有符号的和无符号的, 默认是有符号的. 可以通过 UNSIGNED 来说明某个字段是无符号的. tinyint类型 以tinyint为例, 其它的整型类型都只是数据范围的区别. 数据越界 创建一个 tinyint 类型的 num 的属性, 大小为 1 字节, 不…...
Asp.Net Core 异常筛选器ExceptionFilter
文章目录 前言一、异常筛选器的核心概念用途:实现接口:执行时机: 二、使用步骤1.创建自定义异常筛选器2.注册异常筛选器全局注册(对所有 Controller 生效):局部注册(通过特性标记特定的 **Contr…...
WebUI可视化:第2章:技术基础准备
学习目标 ✅ 掌握HTML/CSS基础语法 ✅ 理解JavaScript核心功能 ✅ 了解前后端交互原理 2.1 HTML基础:网页的骨架 2.1.1 基础结构 每个HTML文件都必须包含以下基本结构: html <!DOCTYPE html> <html> <head><title>我的第一个网页</title> …...
Java基础集合 面试经典八股总结 [连载ing]
序言 八股,怎么说呢。我之前系统学习的内容,进行梳理。通过问题的方式,表达出得当的内容,这件事本身就很难。面试时心态、状态、掌握知识的情况等。关于八股文,我不想有太多死记硬背的内容,更多的是希望自我…...
大数据运维面试题
华为大数据运维面试题可能涵盖多个方面,以下是一些可能的面试问题及解析,这些问题旨在考察应聘者的技术知识、问题解决能力和对大数据运维的理解: 一、技术知识类问题 简述大数据运维的主要职责和工作内容 回答示例:大数据运维工…...
OpenBMC:BmcWeb login认证
BmcWeb在include\login_routes.hpp中实现了/login用于完成web的登录: BMCWEB_ROUTE(app, "/login").methods(boost::beast::http::verb::post)(handleLogin);inline void handleLogin(const crow::Request& req,const std::shared_ptr<bmcweb::AsyncResp>…...
Python学习之路(五)-接口API
在 Python 中结合数据库开发接口 API 通常使用 Web 框架(如 Flask 或 Django)和 ORM(对象关系映射)工具(如 SQLAlchemy 或 Django ORM)。以下是使用 Flask 和 SQLAlchemy 的详细步骤,展示如何结合数据库开发一个简单的 API。 使用 Flask 和 SQLAlchemy 开发 API 1. 安…...
数据库+Docker+SSH三合一!深度评测HexHub的全栈开发体验
作为一名技术博主,我最近一直被各种开发工具切换搞得焦头烂额。数据库要用Navicat,服务器管理得开Termius,Docker操作还得切到命令行,每天光在不同工具间切换就浪费了大量时间。直到团队里的一位架构师向我推荐了HexHub这个一体化…...
涂料油墨制造数字化转型的关键技术与挑战
涂料油墨制造行业正处于数字化转型的关键时期,这一转型是提升生产效率、增强产品质量和降低成本的重要途径。以下是该行业在数字化转型中的关键技术与面临的挑战: 关键技术: 工业互联网技术:通过在生产设备上安装传感器…...
UE5 调整字体、界面大小
文章目录 方案一 5.4 版本及以上(推荐)方案二 5.3 版本及以下(推荐)方案三 使用插件(不推荐) 方案一 5.4 版本及以上(推荐) 进入 编辑 > 编辑器偏好设置,如下图所示&…...
【OpenCV图像处理实战】从基础操作到工业级应用
目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现(6个案例)案例1:图像基本操作案例2:边缘检测案例3&…...
生成随机验证码-解析与优化
文章目录 代码功能解析潜在问题与优化建议1. 安全性问题2. 易混淆字符过滤3. 参数校验4. 性能优化 扩展功能示例1. 自定义字符集2. 批量生成验证码 完整优化代码关键总结 代码功能解析 import random import stringdef generate_code(length6):chars string.digits string.a…...
VMware 虚拟机镜像资源网站
常见的 VMware 虚拟机镜像资源网站 网站名称链接地址特点OSBoxes.orgOSBoxes - Virtual Machines for VirtualBox & VMware 提供 .vmx .vmdk,适合 VMware 和 VirtualBox,更新频率高,界面清晰LinuxVMImages.comLinux VM Images - Downlo…...
HTML5 详细学习笔记
1. HTML5 简介 HTML5 是最新的 HTML 标准,于 2014 年 10 月由 W3C 完成标准制定。它增加了许多新特性,包括语义化标签、多媒体支持、图形效果、离线存储等。 1.1 HTML5 文档基本结构 <!DOCTYPE html> <html lang"zh-CN"> <h…...
真.从“零”搞 VSCode+STM32CubeMx+C <1>构建
目录 前言 准备工作 创建STM32CubeMx项目 VSCode导入项目&配置 构建错误调试 后记 前言 去年10月开始接触单片机,一直在用树莓派的Pico,之前一直用Micropython,玩的不亦乐乎,试错阶段优势明显,很快就能鼓捣一…...
Pikachu靶场
本质是信任了不可信的客户端输入。防御核心: 永不信任客户端提交的权限参数(如 user_id, role)。强制服务端校验用户身份与操作权限。定期审计权限模型,避免业务迭代引入新漏洞。 水平越权 1,按照网站的提示要求登录 进…...
五、web自动化测试01
目录 一、HTML基础1、HTML介绍2、常用标签3、基础案例3.1 前端代码3.2 自动化测试 二、CSS定位1、css介绍2、案例3、代码优化 三、表单自动化1、案例2、元素属性定位 四、后台基础数据自动化1、登录1.1 id与class定位1.2 定位一组元素 2、商品新增 一、HTML基础 可参考学习 链…...
利用软件I2C驱动OLED,点亮、熄灭OLED屏幕以及获取当前OLED屏幕开启状态
题目: 参考《I2C通信》的文档,自行连接电路,利用软件I2C驱动OLED,点亮、熄灭OLED屏幕以及获取当前OLED屏幕开启状态。 可以优先实现: 软件I2C初始化函数,用于初始化IO引脚 再实现: 主机发起始位和停止位,主机发送1个字节,…...
数据结构——栈与队列
1.栈 1.1概念 一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。 栈中的数据元素遵守后进先出 LIFO ( Last In First Out )的原则。 压栈:栈…...
【嵌入式系统设计师(软考中级)】第二章:嵌入式系统硬件基础知识(3)
文章目录 4. 嵌入式系统I/O接口4.1 GPIO与PWM接口4.1.1 GPIO接口(General-Purpose Input/Output)4.1.2 PWM接口(Pulse Width Modulation) 4.2 A/D与D/A接口的基本原理与结构4.2.1 DA转换(数模转换,Digital-…...
【网络安全】社会工程学策略
1. 社会工程学简介 社会工程攻击是威胁行为者常用的攻击方式。这是因为,诱骗人们提供访问权限、信息或金钱通常比利用软件或网络漏洞更容易。 您可能还记得,社会工程学是一种利用人为错误来获取私人信息、访问权限或贵重物品的操纵技术。它是一个涵盖性…...
ROS2---时间戳对齐
一、ROS2时间系统架构 时间模型 仿真时间(Simulation Time):由/clock话题驱动,适用于离线仿真与调试。真实时间(Real Time):基于系统硬件时钟,支持PTP协议(IEEE 1588&…...
C语言教程(十五):C 语言函数指针与回调函数详解
一、函数指针 1.1 函数指针的概念 在 C 语言中,函数指针是指向函数的指针变量。每个函数在内存中都有一个起始地址,函数指针就存储了这个起始地址,通过函数指针可以调用相应的函数。 1.2 函数指针的定义 函数指针的定义语法如下:返…...
VSCode如何修改默认扩展路径和用户文件夹目录到其他盘以及微信开发工具如何修改扩展路径到其他盘
ps:因公司电脑c盘内存严重不足,而出本篇文章 1.Visual Studio Code 随着VsCode的使用时间的推移,安装的扩展以及数据逐步增多,导致c盘内存占用较大,所以这里将vscode的默认缓存路径等迁移到其他盘。 步骤如下 1.找到默认的存储…...
抽象类相关
抽象类的定义 抽象类 是一种特殊的类,它不能被实例化,只能作为基类来派生出具体类。抽象类至少包含一个纯虚函数 。纯虚函数是在函数原型前加上 0 的虚函数,表示该函数没有具体实现,必须由派生类来实现。 抽象类的作用 提供统…...
如何测试短信接口
目录 一、测试短信接口的基本流程 1. 了解短信接口文档 2. 使用工具测试短信接口 示例一:用 curl 测试 POST 请求 示例二:用 Postman 设置 POST 请求 3. 编写测试脚本(Python 示例) 二、测试类型和场景 ✅ 正常发送测试 …...
pycharm2024.3.2项目解释器选择问题
问题描述:已经选择了pyau虚拟环境的解释器,运行了conda activate pyau,但是为什么关闭pycharm2024.3.2软件重新启动后,打开终端是(base) PS D:\deepseektest> ,为什么不是(pyau) PS D:\deepseektest> 解决问题&a…...
如何在 Dialog 中安全初始化 ECharts 并自动监听容器大小变化
如何在 Dialog 中安全初始化 ECharts 并自动监听容器大小变化 在使用 ECharts 的 Vue 项目中,我们常常会将图表放入弹窗(如 Element UI 的 <el-dialog>)中进行展示。但你是否遇到过以下问题: 图表初次显示尺寸异常&#x…...
如何借助ETL数据集成工具实现数据一致性?
主要可以从以下几个方面入手: 一、数据抽取阶段(Extract) 统一数据源连接方式:ETL工具通常支持多种数据源连接方式,如关系型数据库、非关系型数据库、文件系统、API接口等。在抽取数据时,要确保对各个数据…...
3.4/Q1,GBD数据库最新文章解读
文章题目:Burden of Carbon Monoxide Poisoning in Asian Countries From 1990 to 2021 and Its Projection Until 2030: An Analysis of the Global Burden of Disease Study 2021 DOI:10.2147/CLEP.S512786 中文标题:1990 年至 2021 年亚洲…...
【高中数学/古典概率】4红2黑六选二,求取出两次都是红球的概率
【问题】 袋子里装4只红球,2只黑球,大小完全相同,抽两次球,每次抽一只,抽出后不再放回,求取出的两次都是红球的概率。 【来源】 数林外传系列之《概率与期望》P20 单埻著 中国科学技术大学出版社 【数学…...
机器人操作中的生成式 AI:综述(上)
25年3月来自香港大学、香港理工、香港科大、浙大和清华大学的论文“Generative Artificial Intelligence in Robotic Manipulation: A Survey”。 本综述全面回顾机器人操作领域生成学习模型的最新进展,并探讨该领域的关键挑战。机器人操作面临着关键瓶颈ÿ…...
Spring AI 核心概念
本文是对Spring AI中涉及到的AI相关核心概念的介绍,笔者结合LangChain、LlamaIndex的使用经验,尝试尽可能清晰的把这些概念解释清楚. 读者也可以参考官方文档作为补充. 模型 提到AI模型,我们的第一印象一定是GPT,DeepSeek这样的大语言模型(…...
第53.5讲 | 小项目实战:用 SHAP 值解释农作物产量预测模型 [特殊字符][特殊字符]
目录 ✅ 项目背景 📦 所用工具 📁 数据字段(模拟) 🧑💻 代码实现步骤 🎯 解读与启发 🧠 项目拓展建议 ✅ 项目背景 我们使用一个简化的玉米产量数据集(可模拟实…...
Linux编译器-gcc/g++使用
1.预处理(进行宏替换) -E开始进行程序编译,在预处理做完的时候,停下来 2.编译(生成汇编) -S 开始编译,编译做完了就停下来 3.汇编(生成机器可识别代码) -c 开始翻译汇编…...
SEO的关键词研究与优化 第二章
回顾上一篇文章, 3. 关键词评估和选择 关键词评估和选择是SEO策略中至关重要的一步。这个过程不仅仅是选择搜索量最高的词,而是要在多个因素之间找到平衡,以确定最有价值的关键词。 3.1 搜索量分析 搜索量是评估关键词潜力的首要指标,但它不应…...
数据结构数组
数组特点 内存是连续的,所以地址可以偏移,支持下标访问。 优点 下标访问(随机访问)的时间复杂度是O(1),末尾增加和删除元素的时间复杂度是O(1)。 访问元素前后相邻位置方便,因为数组每个位置内存是连续的ÿ…...
vscode插件系列-2、认识vscode
这一章,我将带你重新认识vscode 一、工作区划分 1、活动条(Activity Bar) 活动条是一个核心的导航,扩展可以通过在View Containers中配置,从而渲染Views中的视图。 具体来说就是在package.json中配置如下&…...
Java学习手册:TCP 协议基础
一、TCP 协议概述 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,它在 IP 协议的基础上提供了可靠的 数据传输服务。TCP 通过三次握手建立连接,通过四次挥手…...
摘要 | 李录在北大光华管理学院的演讲《价值投资》
李录在北大光华管理学院的演讲《价值投资》是中文投资领域极具影响力的经典内容,尤其是2019年11月的演讲版本。该演讲视频时长90分钟,主要内容围绕价值投资的理论框架、实践难点以及在中国市场的应用展开。以下是该演讲的核心要点解析: 一、价…...
让Docker端口映射受Firewall管理而非iptables
要让Docker容器的端口映射受系统防火墙(如firewalld或ufw)管理,而不是直接通过iptables,可以按照以下步骤配置: 方法一:禁用Docker的iptables规则 (1)编辑Docker配置文件: vi /etc/docker/da…...