您的位置:首页 > 其它

gdb 内存断点watch 的使用

2016-01-23 17:02 441 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: