gdb调试之打印篇(不断实践完善)

来源:互联网 发布:seo外包价格 编辑:程序博客网 时间:2024/06/13 22:26

一、查看内容 p指令
查看数组内容
有时候,你需要查看一段连续的内存空间的值。比如数组的一段,或是动态分配的数据的大小。你可以使用GDB的“@”操作符,“@”的左边是第一个内存的地址的值,“@”的右边则你你想查看内存的长度。例如,你的程序中有这样的语句:

int array = (int ) malloc (len * sizeof (int));
于是,在GDB调试过程中,你可以以如下命令显示出这个动态数组的取值:
p *array@len
@的左边是数组的首地址的值,也就是变量array所指向的内容,右边则是数据的长度,其保存在变量len中,其输出
如果是静态数组的话,可以直接用print数组名,就可以显示数组中所

在gdb中,如果要打印大数组的内容,缺省最多会显示200个元素:

二、查看内存中的内容 x

x/<n/f/u> <addr>

n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。

f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。

u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字 节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。

三、改变变量的值
set variable i = 1

修改变量的值
set var 变量名 = 新值
set {type}变量地址 = 新值