发布时间:2026/7/19 22:02:51
Linux 命令行入门学习资料 day_6
GDB 监视点watch一、什么是 watch—— 变量的“监控摄像头”之前学过的break是按位置暂停比如某一行代码而watch是按数据变化暂停。watch的作用告诉 GDB 持续监视某个变量或表达式只要它的值发生变化就立刻中断程序执行并显示旧值和新值。典型场景某个变量的值莫名其妙被修改不知道在哪改的想要知道一个全局变量或关键局部变量何时被赋予新值代替在大量地方手动加printf来追踪变量变化二、监视点的三种类型GDB 根据监视的触发条件将监视点分为三类类型命令触发条件写监视点(watchpoint)watch 表达式当被监视的表达式的值被写入修改时触发读监视点(read watchpoint)rwatch 表达式当被监视的表达式的值被读取时触发读写监视点(access watchpoint)awatch 表达式当被监视的表达式的值被读取或写入时触发最常用的是watch也就是写监视点。今天重点掌握它。三、如何使用 watch —— 完整流程演示准备工作写一个简单的测试程序创建文件watch_demo.c#includestdio.hintsum0;// 全局变量方便全程监视voidadd(intn){sumn;// 这里会修改 sum}intmain(){inti;for(i1;i3;i){add(i);printf(After adding %d, sum %d\n,i,sum);}return0;}编译必须加-g建议不要优化gcc-g-O0watch_demo.c-owatch_demo进入 GDB 并设置监视点gdb ./watch_demo1. 先给 main 函数设一个断点确保程序跑起来后再设 watch因为 watch 要监视的变量必须存在于当前作用域(gdb) break main Breakpoint 1 at 0x...: file watch_demo.c, line ... (gdb) run Starting program: ./watch_demo Breakpoint 1, main () at watch_demo.c:12 12 for (i 1; i 3; i) {2. 设置监视点监视全局变量sum(gdb) watch sum Hardware watchpoint 2: sum“Hardware watchpoint” 表示系统使用硬件寄存器来监视速度很快。3. 继续运行程序(gdb) continue Continuing.程序会一直运行直到sum的值发生变化。4. 触发监视点当第一次执行sum n后GDB 会突然暂停Hardware watchpoint 2: sum Old value 0 New value 1 add (n1) at watch_demo.c:7 7 }它告诉我们监视点编号 2sum的旧值是 0新值变成了 1程序停在修改sum的那一行实际上是add函数的第 7 行即修改sum语句的结束此时你可以用print n查看参数用backtrace查看调用栈。5. 继续运行观察每次变化(gdb) continue Continuing. After adding 1, sum 1 Hardware watchpoint 2: sum Old value 1 New value 3 add (n2) at watch_demo.c:7 7 }重复操作每次sum被修改都会暂停直到程序结束。四、监视局部变量如果监视的是局部变量必须在它的作用域内设置 watch并且一旦离开作用域监视点会自动删除。例子监视main中的循环变量i。(gdb) break main (gdb) run (gdb) watch i Hardware watchpoint 3: i (gdb) continue但需要注意当i在循环内频繁被修改每次都会触发可能过于频繁。如果只想在某个特定条件下暂停可以用条件监视点见后文。五、监视表达式watch不仅可以监视单个变量还可以监视任何合法的表达式。只要表达式的值发生变化就会触发。示例监视sum i虽然这不太常用但展示灵活性(gdb) watch sum i当sum或i任何一个变化导致sum i的结果改变时都会触发。注意复杂表达式可能无法使用硬件监视点此时 GDB 会自动降级为软件监视点软件监视点会让程序单步执行非常慢应尽量避免。六、条件监视点就像断点可以加条件一样watch也可以加条件只关心特定情况。格式watch 变量 condition 监视点编号 条件或者一步到位watch 变量 if 条件示例只监视sum被修改且新值大于 2 时才暂停。(gdb) watch sum (gdb) condition 2 sum 2或者(gdb) watch sum if sum 2这样当sum从 1 变到 3 时会触发新值 3 2但之前sum从 0 变到 1 时不会触发。七、管理监视点监视点和断点共用相同的编号体系所以可以用管理断点的命令来管理监视点。命令作用info watchpoints或info breakpoints查看所有监视点和断点delete 编号删除指定监视点/断点disable 编号暂时禁用监视点enable 编号启用监视点ignore 编号 count忽略监视点触发 count 次针对软件监视点示例(gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep y 0x... in main at watch_demo.c:12 2 hw watchpoint keep y sum (gdb) delete 2就会删除对sum的监视。八、硬件监视点 vs 软件监视点硬件监视点 (hw watchpoint)依赖处理器提供的调试寄存器数量有限一般 x86 有 4 个但对程序运行速度几乎无影响。软件监视点 (sw watchpoint)当硬件监视点不够用或表达式复杂无法用硬件实现时GDB 会使用软件监视点。其原理是每执行一条指令后都检查变量是否变化导致程序运行极慢。如果看到Software watchpoint提示要尽量简化监视表达式。查看监视点类型info breakpoints中 Type 列会显示hw watchpoint或watchpoint软件。九、实战综合示例追踪一个神秘错误假设有一个程序某个变量counter莫名被清零我们可以这样调试(gdb) watch counter Hardware watchpoint 1: counter (gdb) run ... Hardware watchpoint 1: counter Old value 100 New value 0 0x... in some_function () at buggy.c:42立刻就找到了清零的代码位置。十、✅ watch 命令速查卡命令简写作用示例watch 变量wa 变量当变量被写入时暂停watch sumrwatch 变量rw 变量当变量被读取时暂停rwatch flagawatch 变量aw 变量当变量被读或写时暂停awatch statuswatch 变量 if 条件-条件监视watch x if x 10info breakpointsi b列出所有监视点和断点i bdelete 编号d 编号删除监视点/断点d 2disable 编号-禁用监视点disable 3enable 编号-启用监视点enable 3十一、练习由易到难基础篇使用上面的watch_demo.c程序在 GDB 中对sum设置写监视点运行并记录每次触发时的新值。在同一个程序中尝试对main中的局部变量i设置watch i观察触发频率。然后删除该监视点。使用awatch sum观察程序是否在读取sum时也会暂停如在printf中。进阶篇编写一个小程序swap_test.c内容如下#includestdio.hvoidswap(int*a,int*b){inttemp*a;*a*b;*btemp;}intmain(){intx5,y10;printf(Before: x%d, y%d\n,x,y);swap(x,y);printf(After: x%d, y%d\n,x,y);return0;}在 GDB 中对x设置写监视点注意x是main中的局部变量需在进入main后设置。运行程序观察x是否在swap中被修改GDB 会停在哪里用backtrace查看调用栈。对指针变量设置监视点在swap函数内对*a设置watch *a观察它何时变化。提高篇编写一个程序包含一个全局数组int data[10]。在循环中修改data[3]的值。在 GDB 中对data[3]设置写监视点直接watch data[3]。注意观察硬件监视点可能支持但若提示软件监视点解释原因并记录运行速度。尝试条件监视监视sum只在变为偶数时暂停watch sum if sum % 2 0。用之前的watch_demo.c验证。十二、答案与关键点解析基础篇每次暂停输出新旧值依次为 0→1, 1→3, 3→6。i每次循环变化都会触发非常频繁。awatch sum会在printf读取sum时也触发如果监视成功通常硬件支持读写监视。进阶篇编译加-g -O0。watch x必须在main断点后设置。当执行swap(x,y)时*a的修改会改变xGDB 会停在*a *b;或下一行。backtrace显示swap和main。在swap函数内watch *a会在*a *b时触发旧值 5新值 10。提高篇对数组元素data[3]设置监视点通常可以用硬件监视点如果支持。若是软件监视点运行会明显变慢。条件监视watch sum if sum % 2 0。当sum从 0 变 1不触发1 变 3不触发3 变 6触发因为新值 6 是偶数。十三、学习检查清单watch和break的根本区别是什么设置watch x后什么时候程序会暂停如果监视的局部变量离开了作用域会发生什么如何查看当前设置的所有监视点如何删除一个监视点硬件监视点和软件监视点有什么区别哪种更快怎样设置“只在新值为负数时才暂停”的监视点如果这些问题都能流畅回答说明你已经把watch命令的核心用法完全吸收。现在你可以用这把“变量监控刀”去精准地剖析任何程序中的数据变化。实际编程中结合break、print和watch你将拥有非常强大的调试能力。继续加油

相关新闻

MMORPG 大规模战斗场景海量特效优化
2026/7/19 21:02:51

MMORPG 大规模战斗场景海量特效优化

MMORPG 大规模战斗场景海量特效优化一、核心结论 MMORPG 特效 DC 高,90% 是材质不统一、贴图不合并、Shader 变体多、粒子系统乱分层、半透明打断合批。 优化方向就 5 条: 材质归一 → 图集合并 → 合批技术全开 → 粒子规范 → 相机/剔除/LOD二、特效 D…

阅读更多
K-Prototypes混合聚类:数值与类别特征协同建模实战
2026/7/19 21:02:51

K-Prototypes混合聚类:数值与类别特征协同建模实战

1. 项目概述:当数据里既有数字又有文字,K-Means 和 K-Modes 单打独斗就真不行了你手头有一份客户档案表:年龄、年消费额、所在城市、职业类别、是否开通会员、最近一次购买商品大类……一眼扫过去,数据类型五花八门——年龄和消费…

阅读更多
Windows CE应用程序部署与自启动实战指南
2026/7/19 21:02:51

Windows CE应用程序部署与自启动实战指南

1. Windows CE应用程序部署与自启动方案解析在工业控制、嵌入式设备和专用终端领域,Windows CE(简称WinCE)作为经典的实时操作系统仍保持着广泛应用。最近在调试某型号工业触摸屏时,需要实现定制应用程序的开机自启动功能&#xf…

阅读更多
Lagrange主题安全指南:保护你的Jekyll博客免受常见威胁
2026/7/20 12:02:54

Lagrange主题安全指南:保护你的Jekyll博客免受常见威胁

Lagrange主题安全指南:保护你的Jekyll博客免受常见威胁 【免费下载链接】Lagrange A minimalist Jekyll theme for running a personal blog powered by Jekyll and GitHub Pages 项目地址: https://gitcode.com/gh_mirrors/lagr/Lagrange 在当今数字时代&am…

阅读更多
Python运算符详解:从基础到高级应用
2026/7/20 12:02:54

Python运算符详解:从基础到高级应用

1. Python运算符基础解析Python作为一门简洁高效的编程语言,其运算符系统设计既保留了传统编程语言的特性,又融入了Python特有的语法糖。运算符本质上就是告诉解释器执行特定数学或逻辑操作的符号,它们构成了程序逻辑的基础骨架。在Python中&…

阅读更多
电商秒杀系统架构设计:高并发场景下的流量削峰与防超卖实践
2026/7/20 12:02:54

电商秒杀系统架构设计:高并发场景下的流量削峰与防超卖实践

一、 秒杀的本质是什么秒杀是电商系统中最极端的流量场景。一个秒杀活动在开始的那一秒,可能会有数十万甚至数百万用户同时点击"立即抢购"按钮,而活动的商品库存可能只有几百件或几千件。这种流量特征与日常购物完全不同。日常流量是分散的、平…

阅读更多
终极游戏文件解包神器:QuickBMS完整指南,免费解锁200+游戏资源格式
2026/7/20 12:02:54

终极游戏文件解包神器:QuickBMS完整指南,免费解锁200+游戏资源格式

终极游戏文件解包神器:QuickBMS完整指南,免费解锁200游戏资源格式 【免费下载链接】QuickBMS QuickBMS by aluigi - Github Mirror 项目地址: https://gitcode.com/gh_mirrors/qui/QuickBMS 你是否曾面对游戏中的神秘资源文件束手无策&#xff1…

阅读更多
电商订单履约与库存扣减的最终一致性设计:从实时扣减到异步对账的全链路实践
2026/7/20 12:02:54

电商订单履约与库存扣减的最终一致性设计:从实时扣减到异步对账的全链路实践

一、 一个看似简单实则复杂的问题用户在电商平台下单,系统扣减库存。这个操作看起来简单,但如果深入追问几个问题,就会发现它并不像表面那么简单。库存什么时候扣?是在用户点击"提交订单"时扣,还是在支付成功…

阅读更多
C++与C#美颜SDK开发深度对比:性能、效率与实战选型指南
2026/7/20 11:02:54

C++与C#美颜SDK开发深度对比:性能、效率与实战选型指南

1. 项目概述:为何要深入对比C与C#的美颜SDK开发?在桌面端,尤其是Windows平台上开发美颜SDK,技术栈的选择往往决定了产品的性能天花板、开发效率以及未来的维护成本。C和C#,作为微软生态下的两大主力语言,在…

阅读更多
噗叽短视频界面分析
2026/7/19 0:02:46

噗叽短视频界面分析

1 和小红书类似,可以采用类似判断方法------------其实他比小红书好判断,因为他没有图片,控件位置几乎是固定的,都不用判断------------2 因为他没有点赞按钮------------而且几乎所有控件位置都是完全一样的,所以我就…

阅读更多
噗叽自动化评论脚本基本完成
2026/7/19 0:02:46

噗叽自动化评论脚本基本完成

整个开发过程,耗时2.5小时:

阅读更多
游戏服务器性能调优:基于 ECS 架构的确定性帧同步与 Go 协程并发模型实践
2026/7/19 0:02:46

游戏服务器性能调优:基于 ECS 架构的确定性帧同步与 Go 协程并发模型实践

游戏服务器性能调优:基于 ECS 架构的确定性帧同步与 Go 协程并发模型实践 一、游戏服务器的性能铁三角:帧率、延迟、并发数 游戏服务器与普通 Web 服务器的性能指标完全不同。Web 服务器关注 QPS 和 P99 延迟,游戏服务器关注帧速率&#xff0…

阅读更多
2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!
2026/7/20 0:02:51

2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!

7月18日智东西消息,在2026 WAIC期间,努比亚联合字节豆包打造的二代“豆包手机”努比亚NaviX Ultra首次亮相,相比一代有诸多升级。智能体手机理念中兴通讯终端事业部总裁、努比亚总裁倪飞表示,智能体手机要从人操作手机变为手机帮人…

阅读更多
努比亚NaviX Ultra亮相WAIC,智能体手机能否让用户生活更简单?
2026/7/20 0:02:51

努比亚NaviX Ultra亮相WAIC,智能体手机能否让用户生活更简单?

努比亚NaviX Ultra:外观与功能双升级在2026 WAIC期间,首次亮相的努比亚NaviX Ultra吸引了众多目光。它是努比亚联合字节豆包打造的二代“豆包手机”,与一代努比亚M153相比,外观设计变化较大。其机身背部搭载横向排布的大尺寸影像模…

阅读更多
C# 将逗号分割的字符串转换为long,并添加到List<long>
2026/7/20 0:02:51

C# 将逗号分割的字符串转换为long,并添加到List<long>

目录 方法1:使用Split和Convert.ToInt64 方法2:使用LINQ的Select和ToList 方法3:使用TryParse进行异常安全转换(推荐) 如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天…

阅读更多
基于Dify与DeepSeek构建私有知识库问答系统实战指南
2026/7/20 0:40:52

基于Dify与DeepSeek构建私有知识库问答系统实战指南

在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…

阅读更多
FAE放射组学分析工具:医学影像特征探索的完整解决方案
2026/7/20 0:48:14

FAE放射组学分析工具:医学影像特征探索的完整解决方案

FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE 你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…

阅读更多
DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖!
2026/7/20 0:45:44

DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖!

DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖! 【免费下载链接】DesktopNaotu 桌面版脑图 (百度脑图离线版,思维导图) 跨平台支持 Windows/Linux/Mac OS. (A cross-platform multilingual Mind Map Tool) 项目地址:…

阅读更多