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

炫酷gdb

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

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

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

processbar-debug:Main.c Processbar.cgcc -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

区域化执行 

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

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

相关文章:

炫酷gdb

在VS里面调试很方便对吧?(F5直接调试,F10逐过程调试--不进函数,F11逐语句调试--进函数,F9创建断点),那在Linux中怎么调试呢? 我们需要用到一个工具:gdb 我们知道VS中程…...

windows 7 10 11快捷键到启动页面

1.快速打开用户启动文件夹 shell:startup 方式2:快速打开系统启动文件夹 shell:Common Startup shell:Common Startup...

[处理器芯片]-6 超标量CPU实现之浮点运算

1 浮点运算单元FPU 超标量CPU中的浮点运算单元是专门处理浮点数运算的关键组件。浮点运算单元的设计涉及多个复杂的子模块和技术,以保证高效、准确地执行浮点数的加减法、乘法、除法、平方根等操作。 1)浮点数术语 浮点数通常采用IEEE 754标准表示&…...

又有人叫嚣:AI取代前端,来给你几张图,看能不能憋死AI。

总有自媒体人,为了些许流量,在大放厥词,说截个图给AI,AI就能输出前端代码,这是啥都敢说,吹牛不上税。 我来给你几张贝格前端工场日常接的大数据项目相关的图,你让AI生成代码,取代前…...

ISCC2024个人挑战赛WP-WEB

(非官方解,以下内容均互联网收集的信息和个人思路,仅供学习参考) 还没想好名字的塔防游戏 GET /world.js HTTP/1.1 Host: 101.200.138.180:17345 Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,i…...

Android 使用 adb 列出设备上所有危险权限

步骤1:确定 Android SDK 位置 打开 Android Studio 的设置,并来到 Languages & Frameworks › Android SDK 处: 这里可以看到 Android SDK 目录的位置: 例如:/Users/admin/Library/Android/sdk。 复制这个路径&am…...

Spring AOP源码分析

#### AOP(面向切面编程)作用及其优势 作用:在程序运行期间,在不修改源码的情况下对方法进行功能增强(通知) 优势:减少重复代码,提高代码复用性,提高代码可维护性&#xf…...

[LLM]从GPT-4o原理到下一代人机交互技术

一 定义 GPT-4o作为OpenAI推出的一款多模态大型语言模型,代表了这一交互技术的重要发展方向。 GPT-4o是OpenAI推出的最新旗舰级人工智能模型,它是GPT系列的一个重要升级,其中的"o"代表"Omni",中文意思是“全…...

【Spring】AOP——通知(Advice)

1、通知(Advice) 1.1简介 在AOP中,通知(Advice)是切面(Aspect)中的一部分,用于定义在连接点(Joinpoint)处应该执行的操作。通知类型可以在AOP框架中配置和使…...

python中的一些基础概念

在python中整型数据可以和浮点型数据相加,在python中字符串数据可以进行相加, 在python中整型数据可以和布尔类型进行算术运算。此时True当做1,False当做0但是这样的操作是没有意义的, python中只有字符串类型没有字符类型&…...

8.Redis之hash类型

1.hash类型的基本介绍 哈希表[之前学过的所有数据结构中,最最重要的] 1.日常开发中,出场频率非常高. 2.面试中,非常重要的考点, Redis 自身已经是键值对结构了Redis 自身的键值对就是通过 哈希 的方式来组织的 把 key 这一层组织完成之后, 到了 value 这一层~~ value 的其中…...

Edge浏览器

微软 Edge 是由微软开发的网络浏览器,它是 Windows 10 操作系统的默认浏览器,取代了之前的 Internet Explorer。Edge 浏览器在设计上注重性能、安全性和易用性,同时也提供了许多实用的功能,如内置笔记、阅读视图、集成的语音助手等…...

springboot项目中图片上传之后需要重启工程才能看到图片?

需求背景 最近在做一个用户自定义上传头像的小需求,用户上传头像然后需要立马回显。 需求是很常见的、正当的需求。如果不使用到对象存储这类服务,我们把用户头像的图片文件仅存在本地就可以了。我们在开发的过程中为了工程管理方便通常下意识会将图片…...

打卡信奥刷题(20)用Scratch图形化工具信奥B3756 [信息与未来 2021] 幸运数字

本题的基础是进制转换,关于2进制转换可以参考打卡信奥刷题(19)用Scratch图形化工具信奥B3972 [语言月赛 202405] 二进制 题解 知道了2进制,来实现5进制、7进制、9进制是一样的。 [信息与未来 2021] 幸运数字 题目描述 如果⼀个…...

Stream流模式通信及示例

Stream流模式通信是指在计算机网络中,数据作为连续的字节流传输而不是独立的数据包。它是一种面向连接的通信方式,常见于TCP(传输控制协议)。以下是Stream流模式通信的基本概念和一个简单的示例。 基本概念 面向连接&#xff1…...

从0开始学统计-t分布

1.t分布是如何被发现的? t分布最早由英国统计学家威廉塞弗顿(William Sealy Gosset)在1908年提出。塞弗顿是爱尔兰的一名酿酒厂的统计学家,他的工作需要对小样本数据进行分析。由于当时样本量较小(通常小于30&#xf…...

Git总结超全版

最近想系统的回顾一下Git的使用,如果只想快速的集成git到idea,可以参考另一篇我的博客中的git部分 目录 版本管理工具简介Git安装与配置Git远程仓库配置 Git常用命令为常用命令配置别名(可选)Git忽略文件.gitignore一些概念*本地仓库操作删除仓库内容 *远…...

网络安全之安全协议浅谈

安全协议 安全协议概述安全协议分类IPSecIPSec安全协议IPSec架构IPSec封装模式AH协议ESP协议SET协议SET协议电子交易模型SET协议安全目标认证中心CA 安全协议概述 安全协议是信息交换安全的核心,它在网络不同层次上、针对不同应用,通过对各种密码学技术…...

华为云部署前端项目发生的事

今天刚买了一个云服务,想着部署一下前端项目: 使用的是 docker nginx 部署 部署方法,在以往的文章中有介绍,如有兴趣可以看看docker 部署; 结果发现部署成功之后,竟然无法访问,从命令来看&…...

需求:实现一个可以统计代码的运行时间

需求:有一个做加法计算的函数,要统计执行这个加法函数代码运行了多久 import timedef add(a, b):time.sleep(1)return a bst time.time() add(100, 200) et time.time() print("该函数运行时间为:", et - st) 学了闭包&#x…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...

2025季度云服务器排行榜

在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...