Linux的gdb调试
文章目录
- 一、编译有调试信息的目标文件
- 二、启动gdb调试文件
- 1、查看内容list/l:l 文件名:行号/函数名,l 行号/函数名
- 2、打断点b:b文件名:行号/函数名,b 行号/函数名 与 查看断点info/i:info b
- 3、删除断点d:d Num(编号)
- 4、使能断点disable/enable 断点编号:关闭/打开断点
- 5、逐过程next/n(F10)与逐语句step/s(F11)
- 6、跳过断点continue/c:运行至下一个断点处(运行中的F5)
- 7、查看变量内容或地址print/p
- 8、显示变量内容或地址:display(长时间显示)与关闭显示变量内容或地址:undisplay
- 9、运行结束函数并返回:finish(返回之后停下来)
- 10、跳转至指定行:until 行号
- 11、显示当前局部的全部变量:info locals (i locals)
- 12、改变一个变量原有的值:set car 变量=Num
- 13、查看所在函数:bt(也显示进入函数前的函数)
- 14、查看所在行与所在函数:f
- 总结
一、编译有调试信息的目标文件
正常情况下gcc或g++编译链接之后都是不带调试信息的目标文件
这如同VS下的release编译,需要加入选项-g来加入调试信息
正常编译(release版本):
gcc -o 目标文件 源文件 [使用标准]
例如:gcc -o mytest.exe test.c -std=c99(使用c99标准)
g++ -o 目标文件 源文件 [使用标准]
例如:gcc -o mytest.exe test.c -std=c++11(使用c++11标准)加入调试信息(debug版本):
gcc -o 目标文件 源文件 [使用标准]
例如:gcc -o mytest.exe test.c -g -std=c99(使用c99标准)
g++ -o 目标文件 源文件 [使用标准]
例如:gcc -o mytest.exe test.c -g -std=c++11(使用c++11标准)
与正常的release编译就多了一个选项-g
这个使用标准可以不带,但如果发现代码没问题又编译不过就加上使用标准试试

可以从文件大小来对比:

可以从调试信息对比:
指令:readelf -S filename | grep -i debug
例如:readelf -S test.exe | grep -i debug

两个文件分别展示含debug的调试信息,可以看到release文件是没有信息展示的
二、启动gdb调试文件
指令:gdb filename
例如:gdb test.exe
如果出现报错信息:bash: gdb: command not found
看一下安装gdb能不能再次打开
root账号下:yum -y install gdb
如果普通账号能提权就:sudo yum -y install gdb
gdb下常用指令集合:
有些指令可以简写,以VS对比
1、quit/q:退出gdb
2、run/r:运行程序(类似F5,没断点直接跑完)
3、查看内容 list/l:l 文件名:行号/函数名,l 行号/函数名(.c、.txt的普通文件,不是可执行文件)
4、打断点 b:b文件名:行号/函数名,b 行号/函数名(类似F9)
5、查看断点 info/i:如info b
6、删除断点:d Num(编号)
7、使能断点:disable/enable 断点编号(关闭/打开断点)
8、逐过程:next/n(F10)
9、逐语句:step/s(F11)
10、跳过断点continue/c:运行至下一个断点处(运行中的F5)
11、查看变量内容或地址:print/p 变量名或取地址(一次性)
12、显示变量内容或地址:display 变量名或取地址(长时间显示)
13、关闭显示变量内容或地址:undisplay 显示编号
14、运行结束函数并返回:finish(运行结束所在函数,就停下来)
15、跳转至指定行:until 行号(中间的代码都是运行了的!)
16、显示当前局部的全部变量:info locals (i locals)
17、改变一个变量原有的值:set car 变量=Num
18、查看所在函数:bt(也显示进入函数前的函数)
19、查看所在行与所在函数:f
1、查看内容list/l:l 文件名:行号/函数名,l 行号/函数名
有两种使用方法:
1.查看其他文件的内容
2.查看正在调试的内容
list简写成l
指令是:l filename:line(其他文件) 或者 l line(正在调试的文件)
或者显示函数:line 函数名(l filename:函数名)例如:l test.c:0 或者 l 0
指令这里的line是说显示第几行,通常是把line的上下文打印,line放中间显示
以第0行为例:
l test.c:0(指定的文件,通常是源文件)

因为调试文件和.c文件一样,展示的也一样
显示main函数:

(main函数放中间,它的上下文打印显示,行号的时候也是)
显示的不是全部,只是一部分而已
gdb默认记录最近的指令,如果直接按回车则会打印显示接下来没显示的
2、打断点b:b文件名:行号/函数名,b 行号/函数名 与 查看断点info/i:info b
打断点
指令:b filename:line(通常是编译前的源文件)
b line
函数名也是一样的:b 函数名(或其他源文件的函数名)查看断点
指令:info b(直接查看全部断点)
对函数和第几行打断点:

函数名本质也是地址,所以对函数打断点是打函数体内第一行打断点
而且也看到,对于文件或调试的打断点,打的断点也是源文件上的断点
3、删除断点d:d Num(编号)
指令:d Num(断点编号)
例如:d 1
删除断点操作只能用编号删除,删除后编号不重新整理
删除存在的断点:

删除之后使用info查看,删除之后编号不会整理
4、使能断点disable/enable 断点编号:关闭/打开断点
指令:
关闭断点(断点不起作用):disable Num(断点编号)
关闭断点(断点起作用):enable Num(断点编号)
如同VS右击断点开启或关闭断点
如图所示:

关闭的断点调试时不起作用
5、逐过程next/n(F10)与逐语句step/s(F11)
指令:
逐过程:next/n(如同VS调试的F10)
逐语句:step/s(如同VS调试的F11)
逐过程(F10):

逐语句(F11):

6、跳过断点continue/c:运行至下一个断点处(运行中的F5)
指令:
运行至下一个断点处:continue/c(跳过断点,同VS运行中的F5)
如图所示:

如果再重新运行run/r则会询问是否重新开始运行:

7、查看变量内容或地址print/p
指令:
查看变量内容或地址:print/p
例如:p a 或 p &a
如图:

这种显示方法是一次性的,需要显示的时候要重新输入指令
8、显示变量内容或地址:display(长时间显示)与关闭显示变量内容或地址:undisplay
指令:显示变量内容或地址:display 变量名或取地址
关闭显示变量内容或地址:undisplay 编号
例如:
display a(display &a)
undisplay Num
显示变量内容或地址:

显示的只能在本作用域显示,跳到别的函数则不会显示
关闭显示变量内容或地址:

9、运行结束函数并返回:finish(返回之后停下来)
指令:
运行结束函数并返回:finish
如图:

这个方法可以快速的跳出函数并查看返回了什么
10、跳转至指定行:until 行号
指令:
跳转至指定行:until 行号
如图:

通常来讲,无法从一个函数内跳到另外一个函数,但用来没打断点时跳过循环挺好的
在同一函数内像断点(F9)与F5的配合
11、显示当前局部的全部变量:info locals (i locals)
指令:
显示当前局部的全部变量:info locals (简写为:i locals)

可以看到,显示的全部局部变量,还没定义的也显示了,并且是需要时再使用指令显示
说明是一次性的显示指令,还会预先显示变量
12、改变一个变量原有的值:set car 变量=Num
指令:
改变一个变量原有的值:set car 变量=Num
例如:set var i=50
如图:

这种是本质上改变变量的值,让循环运算有种不确定的执行方法
这种设置方法可以面对特殊情况,比如怀疑变量到了哪个值出现的问题
13、查看所在函数:bt(也显示进入函数前的函数)
指令:
查看所在函数:bt
如图:

可以看到显示了当前所在的函数
当进入另外一个函数时,能看到当前函数,还能看到调用该函数时的函数
14、查看所在行与所在函数:f
指令:
查看所在行:f
如图:

这个指令可以查看所在第几行,搭配 list/l 来查看就能知道上下文
这指令是不注意按出来的,不知道不同版本会不会使用不同
总结
以当前指令窗口看,使用效率与使用便捷无法与图形化界面比较
图形化界面能看边调试边查看代表,指令窗口只能用指令来调试
图形化界面有快捷键,指令窗口只有简写指令
如果一个偏复杂的程序,图形化界面更好,指令窗口没啥优势
加油吧少年!

相关文章:
Linux的gdb调试
文章目录 一、编译有调试信息的目标文件二、启动gdb调试文件1、查看内容list/l:l 文件名:行号/函数名,l 行号/函数名2、打断点b:b文件名:行号/函数名,b 行号/函数名 与 查看断点info/i:info b3、删除断点d:…...
IO多路复用-select模型
IO多路复用(IO Multiplexing)是一种高效的网络编程模型,可以同时监控多个文件描述符(包括套接字等),并在有数据可读或可写时进行通知。其中,select模型是最常用和最早引入的一种IO多路复用模型。…...
班级事务管理系统设计与实现
** 🍅点赞收藏关注 → 私信领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅** 一 、设计说明 1.1 选题…...
金三银四面试必问:Redis真的是单线程吗?
文章目录 01 Redis中的多线程1)redis-server:2)jemalloc_bg_thd3)bio_xxx: 02 I/O多线程03 Redis中的多进程04 结论▼延伸阅读 由面试题“Redis是否为单线程”引发的思考 作者:李乐 来源:IT阅读…...
notejs+nvm+angular+typescript.js环境 Hertzbeat 配置
D:\Program Files\nodejs\ D:\Users\Administrator\AppData\Roaming\nvm nvm命令提示 nvm arch:显示node是运行在32位还是64位。 nvm install <version> [arch] :安装node, version是特定版本也可以是最新稳定版本latest。 可选参…...
docker安装单机版canal和使用
说明:我安装的组件架构如下: 1、准备一台虚拟机,192.168.2.223,我安装的时候,docker只支持canal1.1.6版本,1.1.7无法使用docker安装.还有一点要补充,就是1.1.6好像不支持es8.0以上版本&#x…...
qt_xml文件
文章内容 简单介绍xml文件的增删改查写生成和读取xml文件的例子增删改查 Qt提供了QDomDocument类来操作XML文件。 增加节点: QDomElement root = doc.createElement("root"); doc.appendChild(root);QDomElement element = doc.createElement("element"…...
【DAY05 软考中级备考笔记】线性表,栈和队列,串数组矩阵和广义表
线性表,栈和队列,串数组矩阵和广义表 2月28日 – 天气:阴转晴 时隔好几天没有学习了,今天补上。明天发工资,开心😄 1. 线性表 1.1 线性表的结构 首先线性表的结构分为物理结构和逻辑结构 物理结构按照实…...
AutoGen Studio助力打造私人GPTs
微软最近在开源项目里的确挺能整活儿啊! 这次我介绍的是AutoGen Studio,我认为这个项目把AutoGen可用性又拔高了一个层次的项目 项目给自己的定义是交互式的多Agent workflow 项目地址:autogen/samples/apps/autogen-studio at main microsoft/autogen (github.com) 首先我…...
SpringBoot 自定义映射规则resultMap association一对一
介绍 例:学生表,班级表,希望在查询学生的时候一起返回该学生的班级,而一个实体类封装的是一个表,如需要多表查询就需要自定义映射。 表结构 班级表 学生表 SQL语句 SELECT a.id,a.name,a.classes,b.id classes…...
华东地区汽车相关夹具配套企业分布图,你了解多少?
1、华东地区 上海汽车整车厂众多,大多以设计研发为主,注重技术和造型,这与他们的整体风格息息相关。 作为与国际接轨的特大城市,中国的经济、交通、科技、工业、金融、贸易、会展和航运中心,聚集了大量的设计和研发人…...
SpringBoot - 后端数据返回前端各个数据类型全局格式化
全局配置 import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.j…...
实验室记账项目(java+Mysql+jdbc)
前言: 因为自己学习能力有限和特殊情况必须要找一个项目来做,但是上网搜的那些项目有两种(一种是技术太多,自己能力不够;一种是技术太少,项目太简单)导致都不适合本人,本人现有技术只…...
spring boot 整合 minio存储 【使用篇】
zi导入依赖 <!--minio--><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.0.3</version></dependency> yml配置(默认配置) spring:# 配置文件上传大小限制s…...
【Redis】深入理解 Redis 常用数据类型源码及底层实现(5.详解List数据结构)
本文是深入理解 Redis 常用数据类型源码及底层实现系列的第5篇~前4篇可移步( ̄∇ ̄)/ 【Redis】深入理解 Redis 常用数据类型源码及底层实现(1.结构与源码概述)-CSDN博客 【Redis】深入理解 Redis 常用数据类型源码及底…...
Vue+Flask电商后台管理系统
在这个项目中,我们将结合Vue.js前端框架和python后端框架Flask,打造一个功能强大、易于使用的电商后台管理系统 项目演示视频: VueFlask项目 目录 前端环境(Vue.js): 后端环境(python-Flask&…...
SpringBoot保姆级入门文档
目录 1、SpringBoot的优点 2、和Spring、SpringMVC的对比 3、Xml 和 JavaConfig 1、SpringBoot的优点 2、和Spring、SpringMVC的对比 3、Xml 和 JavaConfig Spring 使用 Xml 作为容器配置文件,在 3.0 以后加入了 JavaConfig,使用 java 类做配置文件使…...
Springboot同一台服务器部署多个项目,导致redis混淆,如何根据不同项目区分
在Spring Boot应用中,如果在同一台服务器上部署了多个项目,并且每个项目都使用Redis作为缓存或存储,为了避免Redis数据混淆,你需要确保各个项目在访问Redis时使用不同的数据库索引号、键前缀或者连接配置。 以下是一些区分不同项目Redis数据的方法: 使用不同数据库索引:…...
redis启动错误
错误: Creating Server TCP listening socket 127.0.0.1:6379: bind: No error redis-server.exe redis.windows.conf redis-cli.exe shutdown auth "yourpassword"...
单片机烧录方式 -- IAP、ISP和ICP
目录 背景 1 什么是ICP 2 什么是ISP 3 什么是IAP 4 总结 背景 对于51单片机,我们使用STC-ISP上位机软件通过串口进行程序的烧写;对于STM32系列单片机,我们既可以通过串口烧写程序,也能通过JLink或是STLink进行程序的烧写&am…...
基于重要性的生成式对比学习的无监督时间序列异常预测
Unsupervised Time Series Anomaly Prediction with Importance-based Generative Contrastive Learning 转自:在智能制造、工业自动化、能源调度、网络安全、智慧水务、航空航天等现代复杂系统中,关键过程数据通常以多变量时间序列的形式实时产生。保障…...
python pip-audit
# 聊聊 Python 项目里的安全卫士:pip-audit 最近在维护几个老项目,升级依赖的时候总有点提心吊胆。不知道你有没有这种体验——明明只是更新了一个小版本,测试也通过了,但心里总不踏实,担心某个不起眼的依赖包里藏着已…...
【IEEE出版、中南大学主办】第七届计算机视觉、图像与深度学习国际学术会议(CVIDL 2026)
第七届计算机视觉、图像与深度学习国际学术会议(CVIDL 2026)定于2026年5月22-24日在中国 长沙隆重举行。会议旨在为从事计算机视觉、图像与深度学习研究的专家学者、工程技术人员、技术研发人员提供一个共享科研成果和前沿技术,了解学术发展…...
mysql高频触发器降低SQL执行效率_优化触发器逻辑或改用存储过程
触发器中避免嵌套多条DML、跨库查询和无索引SELECT,优先用ON DUPLICATE KEY UPDATE合并操作;存储过程须显式事务控制与错误处理;权限配置需指定低权限DEFINER并确保必要授权。触发器里写 UPDATE/INSERT 太多,SQL 执行变慢MySQL 触…...
图片EXIF元数据编辑器:单张图片的完整解决方案
做摄影或者图片相关工作的人,对EXIF信息应该不陌生。拍摄日期、相机型号、镜头参数、GPS坐标……这些藏在图片里的元数据,有时候挺重要的。这篇文章来聊聊一款专门编辑EXIF的工具——【图片EXIF元数据编辑器VIP】。工具能做什么这是一款针对单张图片的EX…...
Spring Data 2027 动态查询:灵活构建数据访问层
Spring Data 2027 动态查询:灵活构建数据访问层 在现代 Java 应用开发中,数据访问层的灵活性和可扩展性是构建高质量应用的关键因素。Spring Data 2027 为开发者提供了更加强大和灵活的动态查询能力,使我们能够根据运行时条件构建复杂的查询…...
车规级安全芯片HSM与SE:从标准到实战的供应链安全全景
1. 车规级安全芯片的核心标准解读 第一次接触车规级芯片时,我被各种英文缩写砸得头晕——AEC-Q100、ISO 26262、EAL...后来在某个凌晨三点调试ECU的项目里才真正明白,这些标准不是纸上谈兵,而是关乎车辆生死的安全底线。AEC-Q100就像汽车的&q…...
别再让设计稿印刷出来“色差离谱”!Photoshop中RGB转CMYK的保姆级避坑指南
设计师必看:从屏幕到印刷的零色差实战手册 当你的设计作品从屏幕跃然纸上时,是否经历过那种"理想很丰满,现实很骨感"的绝望?精心调配的渐变色印刷后变成浑浊的色块,鲜艳的LOGO印出来像蒙了一层灰——这几乎是…...
Pandas数据导出实战:to_csv参数详解与高效应用场景
1. Pandas数据导出基础:to_csv方法入门 第一次接触Pandas的数据导出功能时,我完全被to_csv的各种参数搞晕了。记得当时为了把一个简单的DataFrame保存成CSV文件,我反复尝试了十几次才成功。现在回头看,其实掌握几个核心参数就能解…...
R3nzSkin技术解析:英雄联盟内存换肤工具的实战指南与架构揭秘
R3nzSkin技术解析:英雄联盟内存换肤工具的实战指南与架构揭秘 【免费下载链接】R3nzSkin Skin changer for League of Legends (LOL) 项目地址: https://gitcode.com/gh_mirrors/r3n/R3nzSkin R3nzSkin是一款基于内存动态修改技术的英雄联盟游戏换肤工具&…...
