文章目录

  • 前言
  • 数据变化断点
  • 编写测试程序代码
  • 加数据断点并调试
  • 总结

前言

“数据断点”这个说法是沿用在Visual Studio中学到的设置断点的方法,在gdb中一般被叫做“硬件断点”,算是断点调试中一种较为高级的调试方法了,这个方法起初是在VS中学会的,属于有需求必有响应的产物。刚开始调试程序的时候只会设置普通断点,就是在要调试的程序代码所在行设置断点,然后等程序运行到断点处可以单步执行,查看内存变量,遇到多个位置修改一个变量并且要查看是谁改变了变量的时候,就要设置多个断点,当时就想如果可以设置一个断点,当变量值被改变就触发这个断点那该多好啊。

当年果然是太年轻,后来发现这个功能就是VS中的数据断点,同样作用的还有gdb工具的中硬件断点,硬件断点不仅可以处理上面提到的需求,更是查找内存写超过的强大工具,要想知道一个正常的变量如何被“不正常”地修改了,硬件断点可以说是最佳工具了。

数据变化断点

在gdb工具中设置普通断点的语法是b 变量名/函数名/文件位置,设置数据变化断点(硬件断点)语法也很简单,只需要一个watch命令即可,写法为watch 变量名,但是与普通断点不同的是,数据断点必须在程序运行时设置,在敲入r命令之前对变量设置数据断点会提示找不到符号。

编写测试程序代码

  • 首先新建测试文件watchtest.cpp然后添加下面的代码:
#include <iostream>
using namespace std;int main()
{int k = 1;int n;n = 1;k = 2;cout << n << "," << k << endl;n = 3;k = 4;cout << n << "," << k << endl;return 0;
}
  • 将C++源代码编译成可执行文件,为了调试记得加-O0 -g选项
[albert@localhost#17:08:00#/home/albert/test]$g++ watchtest.cpp -O0 -g -o watchtest

加数据断点并调试

以下为gdb添加数据变化断点(硬件断点)并调试的整个过程,(gdb)后面的内容为敲入的命令:

[albert@localhost#17:52:47#/home/albert/test]$gdb watchtest
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-83.el6)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/albert/test/watchtest...done.
(gdb) b watchtest.cpp : 6
Breakpoint 1 at 0x40085c: file watchtest.cpp, line 6.
(gdb) watch n
No symbol "n" in current context.
(gdb) r
Starting program: /home/albert/test/watchtestBreakpoint 1, main () at watchtest.cpp:6
6       int k = 1;
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.209.el6_9.2.x86_64 libstdc++-4.4.7-23.el6.x86_64
(gdb) watch n
Hardware watchpoint 2: n
(gdb) c
Continuing.
Hardware watchpoint 2: nOld value = 0
New value = 1
main () at watchtest.cpp:10
10      k = 2;
(gdb) c
Continuing.
1,2
Hardware watchpoint 2: nOld value = 1
New value = 3
main () at watchtest.cpp:14
14      k = 4;
(gdb) c
Continuing.
3,4Watchpoint 2 deleted because the program has left the block in
which its expression is valid.
0x00007ffff72c6d1d in __libc_start_main () from /lib64/libc.so.6
(gdb) q
A debugging session is active.Inferior 1 [process 18567] will be killed.Quit anyway? (y or n) y
[albert@localhost#17:55:04#/home/albert/test]$

总结

  • 设置数据断点需要在程序启动之后,在运行r命令之前设置断点给出信息:No symbol "n" in current context.
  • 当程序运行到监控变量的作用域之外以后,断点自动被删除,这一点观察执行q命令之前的文字可以看出
  • 添加数据变化断点(硬件断点)格式:watch 变量名

gdb使用watch命令设置数据断点相关推荐

  1. gdb的break命令设置断点

    一 指定在源代码的某行处设置断点 1 源代码 #include <iostream> using namespace std; void zww(int age) {int a, b, c ...

  2. GDB调试:观察点(数据断点)【GDB调试】

    观察点 观察点类型 Hardware watchpoint Software watchpoint watch 写观察点 值被改变 满足表达式条件 给特定运行的线程加 watch 查看运行的线程 为运 ...

  3. 【软件开发底层知识修炼】十六 快速学习GDB调试三 使用GDB的数据断点监测变量是否改变

    上一篇文章我们学习了如何使用GDB进行软件断点调试和硬件断点调试:[软件开发底层知识修炼]十五 快速学习GDB调试二 使用GDB进行断点调试 本篇文章继续上一篇文章的学习,如何使用GDB的数据断点监测 ...

  4. Linux+gcc设置断点,gcc/g++常用编译选项和gdb常用调试命令

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? gcc/g++编译器是我们写编译C/C++程序时离不开的编译工具,而gdb又是调试C/C++程序的利器,这一篇文章我们记 ...

  5. gdb 笔记(03)— 某一行设置断点、为函数(单个唯一函数、多个同名函数、使用正则)设置断点、设置条件断点、设置临时断点

    断点 breakpoint,即为了调试的需要,在程序中设置一些特殊标志,代码执行到这些具有特殊标志的位置时会暂停.一旦程序暂停,我们就可以查看或者修改程序运行的一些信息,比如内存信息.堆栈信息等,并且 ...

  6. Pycharm下运行调试Python项目时,当调试既需要给调试的程序传入命令行参数又需要程序在设置的断点处停下里查看变量时的解决方法

      今天在调试了一个复杂的Python项目,其中这个项目的调试需要事先从命令行读取参数,并且在调试期间需要再事先设置的断点处停下来.检查相关的变量.   问题是,在Pycharm的Terminal 输 ...

  7. gdb 跟踪调试命令整理

    内容源自于陈浩CSDN博客的用GDB调试程序一系列文章 用GDB调试程序(一) 用GDB调试程序(二) 用GDB调试程序(三) 用GDB调试程序(四) 用GDB调试程序(五) 用GDB调试程序(六) ...

  8. GDB调试——常用命令

     命令  解释  示例 file <文件名> 加载被调试的可执行程序文件. 因为一般都在被调试程序所在目录下执行GDB,因而文本名不需要带路径. (gdb) file gdb-sample ...

  9. linux进阶17——GDB(三):观察断点和捕捉断点

    GDB 调试器支持在程序中打 3 种断点,分别为普通断点(break).观察断点(watch)和捕捉断点(catch).普通断点(break)前文已经介绍,本文主要介绍观察断点和捕捉断点. 1. wa ...

最新文章

  1. 解决 Angular 官网下载的 library Schematics build 出错的办法
  2. confluence5.8.10的使用
  3. 前端学习(2043)vue之电商管理系统电商系统之优化web.config.js的配置文件
  4. C# ASP.NET MVC 微信和支付宝H5支付开发及Demo
  5. 领域驱动设计(DDD)前夜:面向对象思想
  6. ASP.NET获取远程网页下载到本地文件
  7. 微服务实战——Spring Cloud 第四篇 将服务注册到Eureka Server上
  8. iPhone 13系列7款新机已通过EEC认证:或继续9月亮相
  9. Java时间类之间的转换案例——计算自己活了多少天
  10. WorldList4
  11. oracle管理表空间和数据文件(笔记)
  12. 【创建型】Prototype模式
  13. Kubernetes1.4即将发布
  14. kali下一键破解wifi密码
  15. Netty学习之读netty权威指南(三)
  16. 拳皇世界6月13服务器维护,拳皇世界2月8日例行维护 数据互通公告[图]
  17. ubuntu20.04下搜狗输入法不能输中文问题解决
  18. wsl(windows子系统)简要介绍和安装步骤
  19. 微信小程序为啥有的时候不显示封面广告、以及其他广告
  20. 学好简笔画,再学思维导图

热门文章

  1. div上下左右居中老调重弹
  2. 操作系统底层工作的整体认识
  3. 备战第十二届蓝桥杯电子类《EDA设计与开发》国赛
  4. 龙族幻想最新东京机器人位置_龙族幻想东京攻略异闻怎么触发_龙族幻想东京攻略异闻详细攻略_求知软件网...
  5. 抖音高贵气质的签名_抖音个性签名女简短高端霸气御姐范
  6. 如何在 Word 文档中添加水印?
  7. vscode安装python插件失败_vscode安装python插件
  8. Google 三架马车:GFS、BigTable、MapReduce
  9. 图麟信息科技联合创始人张勋:全面商用化到来,AI全方面融入行业
  10. python打印菱形,n可随意定义