gdb 内存断点watch 的使用

gdb 内存断点watch 的使用1.watch变量的类型a.整形变量:inti;watchi;b.指针类型:char*p;watchp,watch*p;它们是有区别的.watchp是查看*(&p),是p变量本身。watch(*p)是p所指的内存的内容c.watch一个数组或内存区间ch

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

1.  watch 变量的类型
    a. 整形变量: int i; watch i;
    b. 指针类型:  char *p; watch p, watch *p;
    它们是有区别的.
      watch p 是查看 *(&p), 是p 变量本身。

      watch (*p) 是 p 所指的内存的内容, 查看地址,一般是我们所需要的。

      我们就是要看某地址上的数据是怎样变化的,虽然这个地址具体位置只有编译器知道。

    c. watch 一个数组或内存区间
    char buf[128], watch buf,  
    是对buf 的128个数据进行了监视. 此时不是采用硬件断点,而是软中断实现的。
    软中断方式去检查内存变量是比较耗费cpu资源的。
    精确的指明地址是硬件中断。

2. 当你设置的观察点是一个局部变量时。局部变量无效后,观察点无效
 Watchpoint 2 deleted because the program has left the block in
  which its expression is valid.
               
3. 附上一个简单程序方便你利用内存断点观察,调试.
 

$ cat test.cpp
#include <stdio.h>
#include <string.h>
void initBuf(char *buf);
void prtBuf(char *buf);
char mem[8];
char buf[128];
int main()
{
	initBuf(buf);
	prtBuf(buf);
	return 0;
}

void initBuf(char *pBuf)
{
	int i, j;
	mem[0]='0';
	mem[1]='1';
	mem[2]='2';
	mem[3]='3';
	mem[4]='4';
	mem[5]='5';
	mem[6]='6';
	mem[7]='7';
	//ascii table first 32 is not printable
	for(i=2;i<8;i++)
	{
		for(j=0;j<16;j++)
			pBuf[i*16+j]=i*16+j;
	}
}

void prtBuf(char *pBuf)
{
	int i, j;
	for(i=2;i<8;i++)
	{
		for(j=0;j<16;j++)
			printf("%c  ", pBuf[i*16+j]);
		printf("\n");
	}
}

Jetbrains全家桶1年46,售后保障稳定

玩弄内存调试于股掌之中。
(由于效率问题你需要适当控制内存断点设置,当然,对这个小程序无所谓.)
—————————————-
看一下mem 数组, 内存数据是怎样被写入的。
—————————————-
gdb test
b main
watch mem
run
Breakpoint 1, main () at test.cpp:9
gdb) continue
  Continuing.
  Hardware watchpoint 2: mem
  Old value = “\000\000\000\000\000\000\000”
  New value = “0\000\000\000\000\000\000”
  initBuf (pBuf=0x6010a0 <buf> “”) at test.cpp:18
(gdb) continue
  Continuing.
  Hardware watchpoint 2: mem
  Old value = “0\000\000\000\000\000\000”
  New value = “01\000\000\000\000\000”
  initBuf (pBuf=0x6010a0 <buf> “”) at test.cpp:19
(gdb) continue
  Continuing.
  Hardware watchpoint 2: mem
  Old value = “01\000\000\000\000\000”
  New value = “012\000\000\000\000”
  initBuf (pBuf=0x6010a0 <buf> “”) at test.cpp:20
(gdb)
……

(gdb) continue
  Continuing.
  Hardware watchpoint 2: mem
  Old value = “0123456”
  New value = “01234567”
  initBuf (pBuf=0x6010a0 <buf> “”) at test.cpp:26
 

使用watch时出现错误:
—————————————-
Could not insert hardware breakpoints: You may have requested too many hardware breakpoints/watchpoints.
你watch的变量超过了硬件能监控的范围。
原因1:
你设置的watchpoints数量过多,系统一般只支持4个,
原因2:
你监控一个结构/类成员也可能出现这个问题。因为结构太大了.尽管你只是监控了其中一个变量,但gdb按整个结构算.

解决方法:
—————————————-
直接获取你所要监控变量的地址, 监控这个地址.
例如: 监视一个4byte 的整形地址. 书写格式举例如下.
watch *(int*)0x12345678

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/207162.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 通过pycharm安装python_JAVA开发环境

    通过pycharm安装python_JAVA开发环境Python开发环境搭建与helloWorld测试1.去官网下载然后傻瓜式安装2.下载开发IDE:这里选用pychram下载地址:pychram官网新建一个工厂后写简单的helloworld然后:找到你工程的文件,Helloworld.py最后点击OK即可看运行结果:pycha…

  • C语言中有bool类型吗?

    之前一直都没有注意到,最近在用C语言写DSP算法时,偶然间发现我函数中定义的bool类型的变量在VC6.0(我主要用它来检查一下语法错误)中编译居然报错了,说是bool类型没有定义。用了这么久的C和C

    2021年12月22日
  • Opacity属性「建议收藏」

    Opacity属性「建议收藏」开发工具与关键技术:DW,CSS3作者:李敏华撰写时间:2019-2-8CSS3的简单动画,用opacity属性使图片达到一个渐透明的效果,首先建立一个div,类名随意;接下来这些就是css的一些样式设置,见截图:CSS3的一些设置接下来就是效果图效果图如下:…

  • 常用的数据库函数_数据库中自定义函数

    常用的数据库函数_数据库中自定义函数1.COALESCE();很多人知道ISNULL函数,但是很少人知道Coalesce函数,人们会无意中使用到Coalesce函数,并且发现它比ISNULL更加强大,其实到目前为止,这个函数的确非常有用。返回其参数中第一个非空表达式语法:COALESCE(expression[,…n])如果所有参数均为NULL,则COALESCE返回NULL。至少应有一个Null…

    2022年10月25日
  • 经典SQL练习题(MySQL版)

    经典SQL练习题(MySQL版)原文首发于简书于[2018.07.30]网上有一篇关于SQL的经典文章,超经典SQL练习题,做完这些你的SQL就过关了,引用和分析它的人很多,于是今天复习SQL的时候找来练了练手。原作者用的是SQLServer2008,我在这里用的是MySQL8.0.11(二者语法差别不大),文本编辑器用的是Atom1.28.2(不知道大家用什么,反正用Atom写SQL确实丝质顺滑)。题目顺序…

  • JVM垃圾回收机制(一)[通俗易懂]

    JVM垃圾回收机制(一)[通俗易懂]一、什么是垃圾?1:引用计数算法:给对象中加一个引用计数器,每当有一个引用指向它时,计数器的值就加一,引用失效时,计数器的值就减一。当该对象引用计数器等于0的时候就被视为垃圾。该算法存在很大的缺陷,若两个对象存在互相引用,则两者的引用计数器都不为0,都不能被GC。如:publicclassReferenceCountingGC{publi

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号