炫酷gdb

news2024/11/17 15:58:16

在VS里面调试很方便对吧?(F5直接调试,F10逐过程调试--不进函数,F11逐语句调试--进函数,F9创建断点),那在Linux中怎么调试呢?

我们需要用到一个工具:gdb

我们知道VS中程序的版本大致有两种模式:debug(开发模式,可被调试)和release(发布模式,不可被调试),为什么会形成这样的差异呢?其实在编译器形成可执行程序的时候,会给可执行程序添加调试信息,gcc编译的时候默认生成的是release版本,这样实现gcc/g++使用debug模式编译(makefile):

processbar-debug:Main.c Processbar.c
        gcc -o $@ $^ -g

.PHONY:clean
clean:
        rm -f processbar-debug 

debug和release版本的不同可以看出:

debug确实比release版本大了很多(11936-8792=3144) debug版本是新增调试信息,debug版本的肯定比release版本的占用空间大(确实如此则证明新增数据)

那为什么要存在这样的差异呢?

其实是因为使用角色的差异,用户是用户,程序员是程序员,用户是程序的使用者,他不需要知道如何调试,只要会用就好了,多放调试信息还浪费空间,但是程序员是开发者,必须要知道调试信息以供调试,否则开发受阻,bug很难de出来(在公司,产品经理==用户,有的时候产品经理就很抽象,假用户威给程序组没事找事,我要diss这类产品经理)

可以这样来查看debug版本下的调试信息:

readelf -S processbar-debug

 .rodata:只读区

.text:代码区

.data:数据区

.bss:未初始化全局数据区

debug信息: 

readelf -S processbar-debug | grep -i debug

下面简单介绍gdb的使用

使用前先安装下:

yum install -y gdb

所以想要使用就直接gdb+可执行程序名称

gdb processbar-debug

常用命令

quit/q

在进入调试器后想退出可直接quit或者q:

通过分屏可以看出gdb在使用时算一个超绝进程:

list/l

list可用于查询源文件内容,但是是不支持这样直接查询源文件的:

list Processbar.c

从第0行开始查: 

list 0

简写效果是一样的: 

l 0

一查默认是查十行,在gdb中是会记住上次执行过的命令的,所以只需要按回车就可以查询整个文件了:

 ​​​

 也可以这样查:

l Processbar.c:0

还可以查询某个具体函数:

l Processbar.c:ProcBar

 在查询某行的时候并不是从它开始,而是显示上下文:

l 15

run/r

直接r相当于VS中的F5,直接执行不调试 

break/b

直接执行需要配合断点一起使用,break/b就是打断点

b x         //x是行号

断点只能一个一个打 

可以指明给某个文件:

b Processbar.c:20

还可以直接给某个函数打断点:

b main

这样打出来的断点是位于函数的第一条语句处的 

与在VS中的打断点作比较: 

 打过断点的地方可以看出有红点,那gdb中怎么查看打过的断点呢?

可以使用这条命令(info break):

info b

 

i b  

 

 Enb:断点的使能:有/没有

delete/d

在打断点的时候通过文件名+行号打,但是删除的时候不可以通过这种方式删除

 

 通过加编号的方式删除断点:

d x                     //x为号码

 断点编号也是线性增长的

disable/enable

在VS中可以实现禁用断点的功能:

可以通过disable来禁用断点:

disable x                     //x为断点编号

 断点有但无用:

1.被禁用

2.为空行

可以通过enable命令来开启禁用的断点:

enable x             //x为断点编号

next/n

逐过程:F10

即遇到函数不进入函数调试

step/s

逐语句 :F11

遇到函数进入函数,进行逐语句调试

print/p 

在VS中调试是想要看到某些变量的变化过程

在gdb中可以这样来查看变量的变化过程:

p x             //x为变量名

地址也可以查哦:

p &i           //i为变量名

 但是这样查看又太麻烦了,太原始了哇!!!

 display/undisplay

display可以常显示变量

undisplay可以把当前常显示的内容去掉

undisplay x             //x为变量编号
finish

finish是运行结束所在函数就停止 

until

 在调试时可能出现的情况还有比如任意跳转到函数的某一行处(中间代码都运行了)

until x                         //x为行号
info

 info b是查看断点的情况,info locals则可用于查看当前栈帧局部变量的值

info locals   
i locals
set var

set var可用于修改变量的值

set var i=100            //将i的值变为100

区域化执行 

 调试工具的核心作用是帮助你找问题,具体的解决需要人为,如果已经定位到问题所在行,那就不需要进行调试了,调试是为了帮助我们避免进行干瞪眼这种费时费力的调试方法诞生的,如果一份代码几万行,从头盯到尾是很费时费力的,我们希望它做的是区域化执行

因为有断点的存在,我们就可以通过断点实现区域化执行,从一个断点运行到下一个断点处,按范围去打断点就可以实现按范围查找,二分打可快速缩小范围

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

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

相关文章

qt中使用tableWidget不显示表头和内容的可能原因

需求是想要把sqlite数据库中的内容通过tableWidget显示出来,但是在使用过程中发现了一些问题 使用ui->tableWidget->setHorizontalHeaderLabels设置表头的时候,发现怎么样都不显示表头,参考这篇文章,应该使用ui->tableW…

Sping6 笔记(一)【优秀的轻量级框架】

Spring6 介绍: 发布时间:2022年11月Spring 框架是一款优秀的轻量级开源框架,为了解决企业应用开发的复杂性而出现Spring 框架的用途:服务器端的开发特点:简单性、可测试性、松耦合性 学习 Spring6 的前置知识&#x…

react组件中的共享数据

在前面的示例中,每个 MyButton 都有自己独立的 count,当每个按钮被点击时,只有被点击按钮的 count 才会发生改变: 然而,你经常需要组件 共享数据并一起更新。 为了使得 MyButton 组件显示相同的 count 并一起更新&…

Socket同步通讯

目录 引言 1. 建立连接 2. 数据传输 3. 同步机制 4. 处理延迟 5. 安全性 6、一对一Socket同步通讯 客户端 代码分析 服务端 代码分析 7、服务端操作 1、首先我们先运行客户端代码 2、服务端点击Connect连接客户端 3、服务端输入信息传输到客户端 4、断开连接 引…

芯片设计公司外协ERP数字化运营:科技与管理的融合

随着信息技术的快速发展,ERP(企业资源计划)系统已经成为现代企业管理不可或缺的一部分。在芯片设计行业,由于产品的复杂性、技术的高要求以及市场的快速变化,外协ERP数字化运营显得尤为重要。 芯片设计公司的外协ERP数字化运营,主…

javaSwing员工工资管理系统(文档+视频+源码)

摘要 由Java swing mysql数据库实现的员工工资管理系统,该项目功能相对完善,有管理员和普通用户两个角色,分别实现了一些列功能,数据库采用的是mysql 系统实现 我们先以员工的身份查询一下: 接下来我们以管理员身份…

Qt | QCalendarWidget 类(日历)

01、QCalendarWidget 类 1、QCalendarWidget 类是 QWidget 的直接子类,该类用于日历,见下图 02、QCalendarWidget 属性 ①、dateEditAcceptDelay:int 访问函数:int dateEditAcceptDelay()const; void setDateEditAcceptDelay(int) 获取和设置日期编辑器的延迟时间(以毫秒…

事务的ACID是什么及扁平化事务、链式事务

一、什么是事务 1.事务(Transaction)是区别于数据库文件系统的重要特性之一。事务会把数据库从一种一致状态转换为另一种一致状态。在数据库提交工作时,可以确保要么所有修改都已经保存,要么所有修改都不保存。 2.InnoDB存储引擎中的事物完…

深度学习之基于YoloV5车牌识别系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与目标 随着智能交通系统的快速发展,车牌识别技术在交通管理、安防监控等领域扮演着越来越…

javaSwing购物系统项目(文档+视频+源码)

摘要 由Java swing实现的一款简单的购物程序,数据库采用的是mysql,该项目非常简单,实现了管理员对商品类型和商品的管理及用户注册登录后浏览商品、加入购物车、购买商品等功能,旨在学习Java 图形界面开发 系统实现 我们先来管理…

【HarmonyOS尝鲜课】- 下载、安装DevEco Studio以及配置环境、创建运行HarmonyOS项目

下载、安装开发工具 进入DevEco Studio下载官网,单击“立即下载”进入下载页面。 这里以Windows为例进行安装,可以根据操作系统选择对应的版本进行下载。 下载完成后解压一下,进入文件里,双击应用程序,打开安装向导&a…

FreeRTOS_同步互斥与通信_队列集_学习笔记

FreeRTOS_同步互斥与通信_环形buffer、队列_学习笔记 5.5 队列集 要支持多个输入设备时,我们需要实现一个“InputTask”,它读取各个设备的队列,得到数据后再分别转换为游戏的控制键。 InputTask如何及时读取到多个队列的数据?要…

汇聚荣科技有限公司怎么样?

在众多企业中,汇聚荣科技有限公司以其独特的发展模式和市场定位引起了人们的关注。对于这个问题,答案并非简单的好与坏,而需要从多个维度进行深入分析。 一、公司背景与发展历程汇聚荣科技有限公司成立于何年何地,由谁创立&#x…

如何在go项目中实现发送邮箱验证码、邮箱+验证码登录

前期准备 GoLand :2024.1.1 下载官网:https://www.jetbrains.com/zh-cn/go/download/other.html Postman: 下载官网:https://www.postman.com/downloads/ 效果图(使用Postman) Google: QQ: And …

第十五届“北斗杯”全国青少年空天科技体验与创新大赛安徽赛区阜阳市解读会议

5月19日,第十五届“北斗杯”全国青少年空天科技体验与创新大赛安徽赛区阜阳解读活动在阜阳市图书馆隆重举行。共青团阜阳市委员会学少部副部长丁晓龙、阜阳市师范大学物理系副主任黄银生教授、安徽科技报阜阳站站长李伟、市人工智能学会秘书长郭广泽、“北斗杯”安徽…

【html5】02-语义标签

1 引言 语义标签在用法上面与div标签没有区别&#xff0c;但是比div标签没多了层语义性&#xff01;&#xff01; 低版本的浏览器不支持语义标签&#xff0c;即语义标签失效 2 语义标签 <body><!-- <div class"nav"></div><div class&quo…

Lazarus - 从 Hello 开始

我们在《Lazarus - 隐秘的神器》一文中了解到了 Lazarus 的历史和特点&#xff0c;此后将正式开始学习Lazarus 开发。 如果你也对 Windows、Pascal、Delphi 开发感兴趣&#xff0c;请关注 Lazarus专栏 &#x1f4f0; 安装开发环境 官网&#xff1a;Lazarus Homepage (lazarus-i…

智慧园区EasyCVR视频智能管理方案:构建高效安全园区新视界

一、背景分析 园区作为城市的基本单元&#xff0c;是最重要的人口和产业聚集区。根据行业市场调研&#xff0c;90%以上城市居民工作与生活在园区进行&#xff0c;80%以上的GDP和90%以上的创新在园区内产生&#xff0c;可以说“城市&#xff0c;除了马路都是园区”。 园区形态…

Redis的下载、安装、启动和初尝试【超级简单】

redis最好是在Linux系统中使用&#xff0c;这是最接近生产实际的环境。 不过&#xff0c;我们初学者&#xff0c;目的是学习Redis的使用、原理&#xff0c;如果在Linux下直接学习Redis&#xff0c;很可能会因为命令不熟悉而劝退&#xff0c;这是不好的。 因此&#xff0c;我主张…

知乎广告推广开户最低需要多少钱?

精准高效的广告推广&#xff0c;是企业成功的关键&#xff0c;知乎作为知识分享与交流的高端平台&#xff0c;汇聚了大量高质量用户群体&#xff0c;无疑是品牌传播与产品推广的黄金之地。云衔科技作为您数字营销旅程中的得力伙伴&#xff0c;正以专业的知乎广告开户及代运营服…