gdb 断点设置(二)watch

本文深入探讨了GDB中的watch命令,包括其基本使用、表达式设置、硬件观测点的应用及与rwatch、awatch的区别。通过实例展示了如何设置断点以监控变量、地址和复杂语句的变化,并在程序暂停时执行特定命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2、watch

     watch [-l|-location] expr [thread threadnum] [mask maskvalue]

     -l 与 mask没有仔细研究,thread threadnum 是在多线程的程序中限定只有被线程号是threadnum的线程修改值后进入断点。

     经常用到的如下命令:

     watch <expr>

     为表达式(变量)expr设置一个观察点。变量量表达式值有变化时,马上停住程序。

 

     表达式可以是一个变量

     例如:watch value_a

 

     表达式可以是一个地址:

     例如:watch *(int *)0x12345678 可以检测4个字节的内存是否变化。

 

     表达式可以是一个复杂的语句表达式:

     例如:watch a*b + c/d

 

     watch 在有些操作系统支持硬件观测点,硬件观测点的运行速度比软件观测点的快。如果系统支持硬件观测的话,当设置观测点是会打印如下信息:

     Hardware watchpoint num: expr

    如果不想用硬件观测点的话可如下设置:

    set can-use-hw-watchpoints

 

    watch两个变种 rwatch,awatch,这两个命令只支持硬件观测点如果系统不支持硬件观测点会答应出不支持这两个命令的信息:,

 

    rwatch <expr>

    当表达式(变量)expr被读时,停住程序。

       

    awatch <expr>

    当表达式(变量)的值被读或被写时,停住程序。

   

    info watchpoints

    列出当前所设置了的所有观察点。

 

     watch 所设置的断点也可以用控制断点的命令来控制。如 disable、enable、delete等。 

 

     可以为停止点设定运行命令

 

     commands [bnum]

    ... command-list ...

    end

    为断点号bnum指写一个命令列表。当程序被该断点停住时,gdb会依次运行命令列表中的命令。

    例如:

 

        break foo if x>0

        commands

        printf "x is %d/n",x

        continue

        end

    断点设置在函数foo中,断点条件是x>0,如果程序被断住后,也就是,一旦x的值在foo函数中大于0,GDB会自动打印出x的值,并继续运行程序。 

   注意:watch 设置也是断点,如果调试的时候设置的断点(任何种类的断点)过多的时候,watch断点会被忽略,有时候没有任何提示,

            这是我在测试的时候发现的,只有把多余的断点删除后才可用。

<think>好的,用户之前问过如何用GDB查看全局变量被修改的位置,现在他们的问题是“gdb 设置断点位置”。我需要详细讲解如何在GDB设置断点,包括各种方法和技巧。 首先,用户可能已经了解了一些基本的GDB命令,比如watch,但这次他们需要设置断点断点是调试中的基础,所以需要覆盖不同设置方式。 我需要考虑用户可能的场景:他们可能在调试自己的程序,需要暂停在特定位置检查代码。可能的断点类型包括行号、函数、条件断点等。另外,用户可能对临时断点、忽略次数等高级功能感兴趣。 要确保回答结构清晰,分步骤说明。可能的结构是按基础到高级的顺序,包括设置断点的方法、条件断点、临时断点、查看和管理断点,以及常见问题解决。 还要注意用户可能遇到的常见问题,比如断点未触发或位置错误,需要给出解决方法。比如编译时没有调试信息,或者代码优化导致行号不匹配。 另外,用户可能不知道如何设置内存地址断点,这在某些情况下很有用,比如没有源码时。需要提到这一点,但提醒需要谨慎使用。 最后,补充示例和流程图可以帮助用户理解,比如用mermaid展示流程,或者给出具体命令的例子。确保所有命令和代码块格式正确,符合之前的格式要求。 需要检查是否有遗漏的重要功能,比如断点命令自动化(commands),或者多线程中的断点设置。同时,注意使用中文,避免专业术语过于晦涩,保持易懂。 总结下来,回答的结构应包括基础设置、高级技巧、管理命令、问题解决和示例演示。确保覆盖各种设置方式,帮助用户全面了解如何在GDB中有效设置断点。</think>在GDB设置断点是调试程序的核心操作,以下是详细的断点设置方法及使用技巧: --- ### **一、基础断点设置** #### **1. 按行号设置** ```gdb (gdb) break 20 # 在当前文件第20行设置断点 (gdb) break src/file.c:30 # 指定文件设置断点 ``` #### **2. 按函数名设置** ```gdb (gdb) break main # 在main函数入口设置 (gdb) break Class::method # C++类成员函数 (gdb) break func(int, char*) # 带参数类型的重载函数 ``` #### **3. 内存地址断点** ```gdb (gdb) break *0x4005a6 # 在指定内存地址设置 (gdb) break *&variable # 通过变量地址设置 ``` --- ### **、高级断点技巧** #### **1. 条件断点** ```gdb (gdb) break 15 if x > 100 # 当x>100时触发 (gdb) condition 2 i%5==0 # 为2号断点添加条件 ``` #### **2. 临时断点** ```gdb (gdb) tbreak 30 # 触发一次后自动删除 (gdb) tbreak func1:30 # 指定函数内行号 ``` #### **3. 忽略断点** ```gdb (gdb) ignore 3 5 # 忽略3号断点的前5次触发 ``` --- ### **三、断点管理命令** | 命令 | 功能 | |------|------| | `info breakpoints` | 查看所有断点列表 | | `disable 2-4` | 禁用2-4号断点 | | `enable once 3` | 下次触发后禁用3号断点 | | `delete 5` | 删除5号断点 | | `clear` | 清除当前行断点 | --- ### **四、特殊场景处理** #### **1. 模板函数断点** ```gdb (gdb) break 'template_func<int>()' # 需要单引号包裹 ``` #### **2. 匿名命名空间** ```gdb (gdb) break '(anonymous namespace)::func()' ``` #### **3. 动态库函数** ```gdb (gdb) break malloc # 标准库函数 (gdb) set breakpoint pending on # 允许未加载符号断点 ``` --- ### **五、调试流程图** ```mermaid graph TD A[启动GDB] --> B{设置断点方式} B -->|行号| C[break file:line] B -->|函数| D[break func] B -->|地址| E[break *0xADDR] C --> F[条件过滤?] D --> F E --> F F -->|是| G[添加if条件] F -->|否| H[运行至断点] G --> H H --> I[查看上下文] ``` --- ### **六、常见问题解决** #### **1. 断点未触发** - 检查程序是否执行到断点位置 - 确认编译时使用了`-g`选项 - 使用`layout src`查看源码映射是否正确 #### **2. 优化导致行号错位** ```gdb (gdb) set breakpoint always-inserted on # 强制插入断点 (gdb) break func -pended # 等待符号加载 ``` #### **3. 多线程调试** ```gdb (gdb) break 30 thread 2 # 仅在2号线程触发 (gdb) break 30 thread all # 所有线程生效 ``` --- ### **七、断点自动化示例** ```gdb (gdb) break 25 (gdb) commands 1 # 为1号断点添加触发动作 > print var1 # 自动打印变量 > print var2 > continue # 自动继续执行 > end ``` --- ### **八、扩展技巧** #### **1. 正则表达式批量设置** ```gdb (gdb) rbreak ^test_ # 设置所有test_开头的函数断点 ``` #### **2. 观察点与断点结合** ```gdb (gdb) watch var # 变量修改时中断 (gdb) awatch var # 变量被访问或修改时中断 ``` #### **3. 临时修改代码行为** ```gdb (gdb) break 30 (gdb) commands > set var x=42 # 修改变量值 > printf "x modified\\n" > continue > end ``` --- 通过合理使用断点功能可以: - 快速定位崩溃位置 - 跟踪特定条件的数据变化 - 分析复杂调用流程 - 验证代码执行路径 建议配合`next`(单步跳过)、`step`(单步进入)、`finish`(执行完当前函数)等命令进行精细调试。对于大型项目,使用`save breakpoints`命令保存断点配置以便复用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值