GDB的一些小技巧

examine 命令(简写是x)来查看内存地址中的值。

x命令的语法以下所示:
x [n/f/u] [addr] web

n、f、u是可选的参数,下面每一个参数详解svg

参数n: 是一个正整数,表示须要显示的内存单元的个数,也就是说从当前地址向后显示几个内存单元的内容。
参数f: 表示显示的格式,通常来讲GDB会根据变量的类型输出变量的值,也可自定义参见下面指针

x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
s 按字符串格式显示变量xml

参数u: 一个内存单元按照几字节显示,若是不指定的话GDB默认是4个bytes。
b表示单字节
h表示双字节
w表示四字节
g表示八字节事件

参数[addr]: 能够是一个地址,也能够是一个指针或者&Parma取地址内存

n/f/u三个参数能够一块儿使用。例如:
命令:x/4dh 0x123456
表示从内存地址0x123456读取4个单元内容,d表示按十进制显示, h表示一个单元是2字节, 总共显示了8个字节内容字符串


Watchpoint: 它的做用是让程序在某个表达式的值发生变化的时候中止运行,达到‘监视’该表达式的目的

普通内存断点,变量销毁断点会自动删除
watch expr: 设置写watchpoint,当应用程序写expr, 修改其值时,程序中止运行
rwatch expr: 设置读watchpoint,当应用程序读表达式expr时,程序中止运行
awatch expr: 设置读写watchpoint,当应用程序读或者写表达式expr时,程序都会中止运行it

加上-l参数将表达式转换为永久断点
watch -l expr: 设置永久写watchpoint
rwatch -l expr: 设置永久读watchpoint
awatch -l expr: 设置永久读写watchpointevent

内存断点(永久断点)
格式:watch *(数据类型*) addr
例如:
watch *(int*) addr
watch *(long*) addr
watch *(float*) addr
watch *(UserData*) addr变量


Catchpoint: 的做用是让程序在发生某种事件的时候中止运行,好比C++中发生异常事件,加载动态库事件

设置catchpoints:
a. catch event: 当事件event发生的时候,程序中止运行,这里event的取值有:

1)throw: C++抛出异常
2)catch: C++捕捉到异常
3)exec: exec被调用
4)fork: fork被调用
5)vfork: vfork被调用
6)load: 加载动态库
7)load libname: 加载名为libname的动态库
8)unload: 卸载动态库
9)unload libname: 卸载名为libname的动态库
10)syscall [args]: 调用系统调用,args能够指定系统调用号,或者系统名称

b. tcatch event:
设置只停一次的catchpoint,第一次生效后,该catchpoint被自动删除

catchpoints和breakpoints很相像,都有enable/disabe/delete等操做,使用方法也与breakpoints的相似