当前位置: 首页 > news >正文

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&#xff1a;显示node是运行在32位还是64位。 nvm install <version> [arch] &#xff1a;安装node&#xff0c; version是特定版本也可以是最新稳定版本latest。 可选参…...

docker安装单机版canal和使用

说明&#xff1a;我安装的组件架构如下&#xff1a; 1、准备一台虚拟机&#xff0c;192.168.2.223&#xff0c;我安装的时候&#xff0c;docker只支持canal1.1.6版本&#xff0c;1.1.7无法使用docker安装.还有一点要补充&#xff0c;就是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 软考中级备考笔记】线性表,栈和队列,串数组矩阵和广义表

线性表&#xff0c;栈和队列&#xff0c;串数组矩阵和广义表 2月28日 – 天气&#xff1a;阴转晴 时隔好几天没有学习了&#xff0c;今天补上。明天发工资&#xff0c;开心&#x1f604; 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一对一

介绍 例&#xff1a;学生表&#xff0c;班级表&#xff0c;希望在查询学生的时候一起返回该学生的班级&#xff0c;而一个实体类封装的是一个表&#xff0c;如需要多表查询就需要自定义映射。 表结构 班级表 学生表 SQL语句 SELECT a.id,a.name,a.classes,b.id classes…...

华东地区汽车相关夹具配套企业分布图,你了解多少?

1、华东地区 上海汽车整车厂众多&#xff0c;大多以设计研发为主&#xff0c;注重技术和造型&#xff0c;这与他们的整体风格息息相关。 作为与国际接轨的特大城市&#xff0c;中国的经济、交通、科技、工业、金融、贸易、会展和航运中心&#xff0c;聚集了大量的设计和研发人…...

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)

前言&#xff1a; 因为自己学习能力有限和特殊情况必须要找一个项目来做&#xff0c;但是上网搜的那些项目有两种&#xff08;一种是技术太多&#xff0c;自己能力不够&#xff1b;一种是技术太少&#xff0c;项目太简单&#xff09;导致都不适合本人&#xff0c;本人现有技术只…...

spring boot 整合 minio存储 【使用篇】

zi导入依赖 <!--minio--><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.0.3</version></dependency> yml配置&#xff08;默认配置&#xff09; spring:# 配置文件上传大小限制s…...

【Redis】深入理解 Redis 常用数据类型源码及底层实现(5.详解List数据结构)

本文是深入理解 Redis 常用数据类型源码及底层实现系列的第5篇&#xff5e;前4篇可移步(&#xffe3;∇&#xffe3;)/ 【Redis】深入理解 Redis 常用数据类型源码及底层实现&#xff08;1.结构与源码概述&#xff09;-CSDN博客 【Redis】深入理解 Redis 常用数据类型源码及底…...

Vue+Flask电商后台管理系统

在这个项目中&#xff0c;我们将结合Vue.js前端框架和python后端框架Flask&#xff0c;打造一个功能强大、易于使用的电商后台管理系统 项目演示视频&#xff1a; VueFlask项目 目录 前端环境&#xff08;Vue.js&#xff09;&#xff1a; 后端环境&#xff08;python-Flask&…...

SpringBoot保姆级入门文档

目录 1、SpringBoot的优点 2、和Spring、SpringMVC的对比 3、Xml 和 JavaConfig 1、SpringBoot的优点 2、和Spring、SpringMVC的对比 3、Xml 和 JavaConfig Spring 使用 Xml 作为容器配置文件&#xff0c;在 3.0 以后加入了 JavaConfig&#xff0c;使用 java 类做配置文件使…...

Springboot同一台服务器部署多个项目,导致redis混淆,如何根据不同项目区分

在Spring Boot应用中,如果在同一台服务器上部署了多个项目,并且每个项目都使用Redis作为缓存或存储,为了避免Redis数据混淆,你需要确保各个项目在访问Redis时使用不同的数据库索引号、键前缀或者连接配置。 以下是一些区分不同项目Redis数据的方法: 使用不同数据库索引:…...

redis启动错误

错误&#xff1a; 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单片机&#xff0c;我们使用STC-ISP上位机软件通过串口进行程序的烧写&#xff1b;对于STM32系列单片机&#xff0c;我们既可以通过串口烧写程序&#xff0c;也能通过JLink或是STLink进行程序的烧写&am…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...