gdb 内存断点watch 的使用

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

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");
	}
}

玩弄内存调试于股掌之中。
(由于效率问题你需要适当控制内存断点设置,当然,对这个小程序无所谓.)
—————————————-
看一下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

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

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

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 分类模型的f1值大概是多少_准确率召回率f1分数

    分类模型的f1值大概是多少_准确率召回率f1分数欢迎您对PaddleHub提出建议,非常感谢您对PaddleHub的贡献!目前PaddleHub已实现您提出的需求,请安装PaddleHub>=1.7.0,PaddlePaddle>=1.8.0快速体验。请您在定义task任务时增加metrics_choices=[‘f1’]选项,即可实现多分类F1Score评估指标,示例如下:task=hub.ImageClassifierT…

    2022年10月14日
  • js 字符串截取方法汇总

    js 字符串截取方法汇总一、使用slice()截取1,函数说明slice()方法可通过指定的开始和结束位置,提取字符串的某个部分,并以新的字符串返回被提取的部分。语法如下:string.slice(start,end);start(必需):规定从何处开始选取。如果是负数,那么它规定从字符串尾部开始算起的位置。也就是说,-1指最后一个字符,-2指倒数第二个字符,以此类推。参数说明:end(可选):规定从何处结束选取,即结束处的字符下标。如果没有指定该参数,那么截取的字符串包含从start到结束的所…

    2022年6月11日
  • pr添加删除关键帧_pr怎么全选关键帧

    pr添加删除关键帧_pr怎么全选关键帧使用的版本依旧是PrProCC2017添加关键帧双击需要添加关键帧的素材左边指向区域双击后,区域会变大,鼠标滚轮滑动效果一样然后点击素材,在点左侧的指向区域的小点点,添加或删除关键帧点

    2022年8月3日
  • 什么是系统可用性[通俗易懂]

    什么是系统可用性[通俗易懂]在一个阳光明媚的周二下午,我正在公司里面看着即将发布的Java12的新特性,这时候女朋友打来电话。晚上下班后,女朋友回到家里面和我说,发现淘宝无法访问的十几分钟后又可以了。系统可用性系统

    2022年6月30日
  • 翻译:VESA Adaptive-Sync / AMD FreeSync / VRR 白皮书[通俗易懂]

    翻译:VESA Adaptive-Sync / AMD FreeSync / VRR 白皮书[通俗易懂]译者注以下为正文。介绍多年来,显示行业一直普遍认为显示器是以固定的刷新率(refreshrate)运行的,如60Hz。这与以下事实形成鲜明对比:送给显示器的图像内容多种多样,每种图像都有自己独特的、变化的帧率(framerate)。当显示的刷新率与图像内容自身的帧率不同步时,用户可能会察觉到撕裂(tearing)和卡顿(stutter)之类的异常效果。在移动应用程序中(如平板、笔记本电脑),对于静态图像和视频播放来说,较高的显示刷新率不仅显得多余,还增加了系统功耗,降低了续航能力。这些因素使得我

    2022年6月10日
  • Java 中哈希码的说明「建议收藏」

    Java 中哈希码的说明「建议收藏」在Java中,哈希码代表对象的特征。例如下面代码对象根据HashCode由此可得出str1!=str2,str1==str3哈希码产生的依据:哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。也有相同的情况,看程序员如何写哈希码的算法。1:Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。2:String类的hashCode.根据String类包含的字符串的

    2022年10月26日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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