首页技术文章正文

gdb使用watch命令设置数据断点【黑马java培训】

更新时间:2019年07月26日 10时48分33秒 来源:黑马程序员论坛

前言
“数据断点”这个说法是沿用在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
1
加数据断点并调试
以下为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/watchtest

Breakpoint 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: n

Old value = 0
New value = 1
main () at watchtest.cpp:10
10      k = 2;
(gdb) c
Continuing.
1,2
Hardware watchpoint 2: n

Old value = 1
New value = 3
main () at watchtest.cpp:14
14      k = 4;
(gdb) c
Continuing.
3,4

Watchpoint 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 变量名


推荐了解热门学科

java培训 Python人工智能 Web前端培训 PHP培训
区块链培训 影视制作培训 C++培训 产品经理培训
UI设计培训 新媒体培训 产品经理培训 Linux运维
大数据培训 智能机器人软件开发




传智播客是一家致力于培养高素质软件开发人才的科技公司“黑马程序员”是传智播客旗下高端IT教育品牌。自“黑马程序员”成立以来,教学研发团队一直致力于打造精品课程资源,不断在产、学、研3个层面创新自己的执教理念与教学方针,并集中“黑马程序员”的优势力量,针对性地出版了计算机系列教材50多册,制作教学视频数+套,发表各类技术文章数百篇。

传智播客从未停止思考

传智播客副总裁毕向东在2019IT培训行业变革大会提到,“传智播客意识到企业的用人需求已经从初级程序员升级到中高级程序员,具备多领域、多行业项目经验的人才成为企业用人的首选。”

中级程序员和初级程序员的差别在哪里?
项目经验。毕向东表示,“中级程序员和初级程序员最大的差别在于中级程序员比初级程序员多了三四年的工作经验,从而多出了更多的项目经验。“为此,传智播客研究院引进曾在知名IT企业如阿里、IBM就职的高级技术专家,集中研发面向中高级程序员的课程,用以满足企业用人需求,尽快补全IT行业所需的人才缺口。

何为中高级程序员课程?

传智播客进行了定义。中高级程序员课程,是在当前主流的初级程序员课程的基础上,增加多领域多行业的含金量项目,从技术的广度和深度上进行拓展“我们希望用5年的时间,打造上百个高含金量的项目,覆盖主流的32个行业。”传智播客课程研发总监于洋表示。




黑马程序员热门视频教程【点击播放】

Python入门教程完整版(懂中文就能学会) 零起点打开Java世界的大门
C++| 匠心之作 从0到1入门学编程 PHP|零基础入门开发者编程核心技术
Web前端入门教程_Web前端html+css+JavaScript 软件测试入门到精通


在线咨询 我要报名
和我们在线交谈!