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. 附上一个简单程序方便你利用内存断点观察,调试.
玩弄内存调试于股掌之中。
(由于效率问题你需要适当控制内存断点设置,当然,对这个小程序无所谓.)
----------------------------------------
看一下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
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
相关文章推荐
- HDU-5583-Kingdom of Black and White【2015上海赛区】【暴力】
- 统计电影票房排名前10的电影并存入还有一个文件
- 基础练习 Huffuman树(贪心算法)
- hdu Work 5326(并查集)
- Apache与Nginx的优缺点比较
- 自定义控件的的步骤
- mysql 5.6.28 源码安装
- 交换两个数
- PHP JSON取数据
- MySQL分布式XA事务
- 关于TCP粘包和半包的处理
- leetcode219. Contains Duplicate II
- 页面自动跳转----后台传递url
- CSS的font-size属性
- CDUESTC 2016 假期赛1 A题
- C语言 百炼成钢12
- 设计模式——结构型模式
- Android Exception总结
- java数据库连接JDBC
- mysql更新记录时设置自动更新时间戳