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你将拥有非常强大的调试能力。继续加油

相关新闻

国产FPGA技术突破:安路科技AI边缘计算与汽车电子实战指南

国产FPGA技术突破:安路科技AI边缘计算与汽车电子实战指南

国产FPGA技术新突破:安路科技2026慕尼黑电子展全解析与实战应用指南 在AI边缘计算、数据中心服务器和汽车电子快速发展的今天,国产FPGA技术正迎来前所未有的发展机遇。作为国内FPGA领域的领军企业,安路科技在2026年慕尼黑上海电子展上的精彩…

2026/7/28 2:06:24 阅读更多 →
Python核心模块分类与使用指南

Python核心模块分类与使用指南

1. Python常用模块全景概览作为一门通用编程语言,Python的强大之处很大程度上来自于其丰富的标准库和第三方模块生态。这些模块覆盖了从基础数据处理到人工智能开发的各个领域,让开发者能够快速构建功能完善的应用程序。在Python的实际开发中&#xff0c…

2026/7/26 22:42:33 阅读更多 →
锂电池智能充电器使用指南:从原理到实践,避免常见误区

锂电池智能充电器使用指南:从原理到实践,避免常见误区

锂电池充电器,看似简单,但真正用好它,远不止“插上电、接上电池”这么简单。很多人第一次接触B4-BC4S或B4-800D这类带电压显示、支持即插即充的智能充电器时,往往会被其相对丰富的功能界面和偶尔出现的“ER”报错搞得有些不知所措…

2026/7/28 0:06:10 阅读更多 →

最新新闻

Golang的内存管理--学习笔记

Golang的内存管理--学习笔记

Go的内存管理内存的分级arena区SpansGo中的mspan内存管理组件mcachemcentralmheap内存的分配流程内存的分级 使用的是多级分配的办法,将内存分为多级,进行分级管理,从而降低锁的粒度。并且将可用的堆内存采用二级管理,其中每个线…

2026/7/28 20:25:11 阅读更多 →
N_m3u8DL-RE终极指南:跨平台流媒体下载完整解决方案

N_m3u8DL-RE终极指南:跨平台流媒体下载完整解决方案

N_m3u8DL-RE终极指南:跨平台流媒体下载完整解决方案 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL-RE …

2026/7/28 20:25:10 阅读更多 →
终极指南:uBlock Origin如何成为浏览器隐私保护的最佳解决方案

终极指南:uBlock Origin如何成为浏览器隐私保护的最佳解决方案

终极指南:uBlock Origin如何成为浏览器隐私保护的最佳解决方案 【免费下载链接】uBlock uBlock Origin - An efficient blocker for Chromium and Firefox. Fast and lean. 项目地址: https://gitcode.com/GitHub_Trending/ub/uBlock uBlock Origin是一款高效…

2026/7/28 20:25:10 阅读更多 →
5分钟掌握AI视频剪辑:FunClip智能语音识别剪辑完整指南

5分钟掌握AI视频剪辑:FunClip智能语音识别剪辑完整指南

5分钟掌握AI视频剪辑:FunClip智能语音识别剪辑完整指南 【免费下载链接】FunClip FunASR-powered video transcription, subtitle generation, and LLM-assisted clipping tool with a local Gradio UI. 项目地址: https://gitcode.com/GitHub_Trending/fu/FunCli…

2026/7/28 20:25:10 阅读更多 →
碧蓝航线全自动脚本终极指南:告别手动操作,解放你的游戏时间

碧蓝航线全自动脚本终极指南:告别手动操作,解放你的游戏时间

碧蓝航线全自动脚本终极指南:告别手动操作,解放你的游戏时间 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研,全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScri…

2026/7/28 20:25:10 阅读更多 →
jqgrid 单击行启用行编辑,切换行保存原编辑行

jqgrid 单击行启用行编辑,切换行保存原编辑行

为了加速表格互动编辑,我们往往希望通过选中行就触发了行编辑,完成行编辑后,再选中另一个行做编辑,同时上一个编辑行被自动保存,直至完成需要的编辑内容。 页面效果可能如下: 1)设置需要编辑的…

2026/7/28 20:24:10 阅读更多 →

日新闻

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:43 阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:43 阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:43 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻