linux打印堆栈命令 打印java堆栈信息( 五 )


file::variable
function::variable
eg:
查看文件f2.c中的全局变量x的值:
gdb) p 'f2.c'::x
注:如果你的程序编译时开启了优化选项,那么在用GDB调试被优化过的程序时,可能会发生某些变量不能访问 , 或是取值错误码的情况 。对付这种情况时,需要在编译程序时关闭编译优化 。GCC , 你可以使用“-gstabs” 选项来解决这个问题 。
3. 察看数组
(1)动态数组:
p *array@len
array:数组的首地址,len:数据的长度
eg:
(gdb) p *array@len
$1 = {2, 4, 6, 8, 10}
(2)静态数组
可以直接用print数组名,就可以显示数组中所有数据的内容了 。
4. 输出格式
x 按十六进制格式显示变量 。
d 按十进制格式显示变量 。
u 按十六进制格式显示无符号整型 。
o 按八进制格式显示变量 。
t 按二进制格式显示变量 。
a 按十六进制格式显示变量 。
c 按字符格式显示变量 。
f 按浮点数格式显示变量 。
eg:
(gdb) p i
$21 = 101
(gdb) p/a i
$22 = 0x65
(gdb) p/c i
$23 = 101 'e'
5. 察看内存
使用examine(简写x)来查看内存地址中的值 。语法:
x/
n、f、u是可选的参数 。
(1)n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容 。
(2)f 表示显示的格式 , 参见上面 。如果地址所指的是字符串 , 那么格式可以是s,如果地十是指令地址,那么格式可以是i 。
(3)u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes 。u参数可以用下面的字符来代替,b表示单字节,h表示双字节 , w表示四字 节,g表示八字节 。当linux打印堆栈命令我们指定了字节长度后,GDB会从指内存定的内存地址开始 , 读写指定字节,并把其当作一个值取出来 。
eg:
x/3uh 0x54320 :从内存地址0x54320读取内容,h表示以双字节为一个单位 , 3表示三个单位,u表示按十六进制显示 。
6. 察看寄存器
(1)要查看寄存器的值,很简单,可以使用如下命令:
info registers
(2)查看寄存器的情况 。(除了浮点寄存器)
info all-registers
(3)查看所有寄存器的情况 。(包括浮点寄存器)
info registers
(4)查看所指定的寄存器的情况 。
寄存器中放置了程序运行时的数据 , 比如程序当前运行的指令地址(ip),程序的当前堆栈地址(sp)等等 。你同样可以使用print命令来访问寄存器的情况,只需要在寄存器名字前加一个$符号就可以了 。如:p $eip 。
7. display自动显示的变量
(1)格式:display[/i|s] [expression | addr]
eg:
display/i $pc
$pc是GDB的环境变量,表示着指令的地址,/i则表示输出格式为机器指令码,也就是汇编 。于是当程序停下后,就会出现源代码和机器指令码相对应的情形,这是一个很有意思的功能 。
(2)其linux打印堆栈命令他
undisplay
delete display
删除自动显示,dnums意为所设置好了的自动显式的编号 。如果要同时删除几个,编号可以用空格分隔,如果要删除一个范围内的编号,可以用减号表示(如:2-5)
disable display
enable display
disable和enalbe不删除自动显示的设置,而只是让其失效和恢复 。
info display
查看display设置的自动显示的信息 。GDB会打出一张表格,向你报告当然调试中设置了多少个自动显示设置,其中包括,设置的编号 , 表达式 , 是否enable 。

推荐阅读