转贴地址
gdb调试过程中如何查看变量的值?一般说来使用print(p)指令来实现,并有自己很多的输出格式。
print和它的显示格式
p /x var #十六进制显示变量。
p /d var #十进制显示变量。
p /u var #十六进制显示无符号变量。
p /o var #八进制格式显示变量。
p /t var #二进制格式显示变量。
p /a var #十六进制格式显示变量。
p /c var #字符格式显示变量。
p /f var #浮点数格式显示变量。
|
p /x var #十六进制显示变量。
p /d var #十进制显示变量。
p /u var #十六进制显示无符号变量。
p /o var #八进制格式显示变量。
p /t var #二进制格式显示变量。
p /a var #十六进制格式显示变量。
p /c var #字符格式显示变量。
p /f var #浮点数格式显示变量。
|
查看文件中或者函数中的变量
(gdb) p 'file.c'::var
(gdb) p 'function'::var
|
(gdb) p 'file.c'::var
(gdb) p 'function'::var
|
查看数组中元素的值
(gdb) p *array@len #数组首地址,长度
(gdb) p array_name #静态数组可以直接打印名称
|
(gdb) p *array@len #数组首地址,长度
(gdb) p array_name #静态数组可以直接打印名称
|
如果出现了类似 “value has been optimized out” 的字样,表示该变量已经被自动优化了,也就是无法看到。因此gcc在优化的时候很可能会増删改查你的代码。取消自动优化,如下:
#在Makefile中的CFLAGS中增加选项 -gstabs
CFLAGS = -pipe -O -W -Wall -Wpointer-arith -Werror -g -gstabs
|
#在Makefile中的CFLAGS中增加选项 -gstabs
CFLAGS = -pipe -O -W -Wall -Wpointer-arith -Werror -g -gstabs
|
这样重新编译一下就可以了。
使用examine命令查看内存中的数据
语法:x/n/u/f
n、u、f有着各自的含义,可以组合使用。n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。f
表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。u
表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字
节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。
#从内存地址0x54320读
#h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示
(gdb) x/3uh 0x54320
|
#从内存地址0x54320读
#h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示
(gdb) x/3uh 0x54320
|
自动显示选项display
(gdb) display/i $pc #显示源代码和汇编的对应关系
(gdb) undisplay #不要自动显示
(gdb) delete display #删除自动显示
(gdb) disable display #禁用自动显示
(gdb) enable display #启用自动显示
(gdb) info display #display设置的自动显示信息。
|
(gdb) display/i $pc #显示源代码和汇编的对应关系
(gdb) undisplay #不要自动显示
(gdb) delete display #删除自动显示
(gdb) disable display #禁用自动显示
(gdb) enable display #启用自动显示
(gdb) info display #display设置的自动显示信息。
|
其它设置显示选项
set print address on #打开地址输出
set print array on #打开数组优化显示
set print elements #数据显示最大长度
set print null-stop #显示字符串直到遇到结束符
set print pretty on #显示漂亮的结构体
set print sevenbit-strings #字符串或字符数据按\nnn显示
set print union #显示结构体内的联合体数据
#注明:使用 show print xxx 可以查看当前设置
|
set print address on #打开地址输出
set print array on #打开数组优化显示
set print elements #数据显示最大长度
set print null-stop #显示字符串直到遇到结束符
set print pretty on #显示漂亮的结构体
set print sevenbit-strings #字符串或字符数据按\nnn显示
set print union #显示结构体内的联合体数据
#注明:使用 show print xxx 可以查看当前设置
|
历史记录
你可以直接使用 p $2 来显示第二个print的变量,而不必输入 p var-name。
gdb环境变量
你可以在GDB的调试环境中定义自己的变量,用来保存一些调试程序中的运行数据。使用set命令即可,如:
使用环境变量时,GDB会在你第一次使用时创建这个变量,而在以后的使用中,则直接对其赋值。环境变量没有类型,你可以给环境变量定义任一的类型。包括结构体和数组。
(gdb) show convenience #查看当前所设置的所有的环境变量。
|
(gdb) show convenience #查看当前所设置的所有的环境变量。
|
这是一个比较强大的功能,环境变量和程序变量的交互使用,将使得程序调试更为灵活便捷。例如:
(gdb) set $i = 0
(gdb) print bar[$i++]->contents
|
(gdb) set $i = 0
(gdb) print bar[$i++]->contents
|
于是,当你就不必,print bar[0]->contents, print bar[1]->contents地输入命令了。输入这样的命令后,只用敲回车,重复执行上一条语句,环境变量会自动累加,从而完成逐个输出的功能。
阅读(4890) | 评论(0) | 转发(0) |