在使用gdb调试过程中,经常需要查看变量的值,最常用的方法:
(gdb) print {变量名}
一般情况下,打印并不存在问题。但当一个字符串比较长时,打印出来的内容不完整,内容的最后为"..."
例如:
可以看到后面带有省略号,内容没有完整的显示出来。
如何才能将需要print的内容完整显示出来呢?
其实gdb 默认有一个最大显示长度限制,可能通过show print elements命令查看:
可以看到最大显示长度是200
那么要完全显示就要改变这个参数的值了,用set print elements 0 命令设置即可:
再用print就可以完整显示了 :
当然如果不想改这个参数,也可以通过以下命令显示(下面这个方法我试过没有用,并不能突破elements数的限制):
(gdb) p *test@1$7 = "0"(gdb) p *test@4$8 = "0123"(gdb) p *test@1024$9 = "0123456789abcdefghijklmnopqrstuvwxyzn0123456789abcdefghijklmnopqrstuvwxyzn0123456789abcdefghijklmnopqrstuvwxyzn0123456789abcdefghijklmnopqrstuvwxyzn0123456789abcdefghijklmnopqrstuvwxyzn0123456789abcdefghijklmnopqrstuvwxyzn0123456789abcdefghijklmnopqrstuvwxyzn0123456789abcdefghijklmnopqrstuvwxyzn0123456789abcdefghijklmnopqrstuvwxyzn", ' 00' <repeats 690 times>(gdb) <gdb命令中查看地址之x命令>可以使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示:
x/<n/f/u> <addr>
n、f、u是可选的参数:
n 是一个正整数,表示需要显示的内存单元的个数,也就是说从当前地址向后显示几个内存单元的内容,一个内存单元的大小由后面的u定义。
f 表示显示的格式,如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。
u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字 节,g表示八字节。当我们指定了字节长度后,GDB会从指定的内存地址开始,读写指定字节,并把其当作一个值取出来。
<addr>表示一个内存地址。
注意:严格区分n和u的关系,n表示单元个数,u表示每个单元的大小。
n/f/u三个参数可以一起使用。例如:
命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示输出三个单位,u表示按无符号十进制显示。