查看运行时数据
gdb中查看变量的命令是print,一般用它的简写形式p。它的语法如下:
print [</format>] <expr>
其中参数expr可以是一个变量,也可以是表达式。format表示输出格式,例如,可以用/x来将结果按16进制输出。如下是几个基本的例子:
(gdb) p top
$16 = 1
(gdb) p &top
$17 = (int *) 0x804a014 <top>
(gdb) p 3+2*5
$18 = 13
(gdb) p /x 3+2*5
$19 = 0xd
format的取值范围有如下几种:
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
查看函数返回值
查看函数返回值是在调试的过程中经常遇到的需求。例如,对于如下函数
int foo()
{
return 100;
}
我们可以以如下方式获取函数的返回值:
(gdb) finish
Run till exit from #0 foo () at main.c:9
main () at main.c:15
15 }
Value returned is $2 = 100
(gdb) p $eax
$3 = 100
(gdb) info registers
eax 0x64 100
查看连续内存
可以使用GDB的"@"操作符查看连续内存,"@"的左边是第一个内存的地址的值,"@"的右边则你你想查看内存的长度。
例如,对于如下代码:int arr[] = {2, 4, 6, 8, 10};,可以通过如下命令查看arr前三个单元的数据。
(gdb) p *arr@3
$2 = {2, 4, 6}
查看内存
可以使用examine命令(简写为x)来查看内存地址中的值。x命令的语法如下所示:
x /<n/f/u> <addr>
- n 表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
- f 表示显示的格式,如果是字符串,则用s,如果是数字,则可以用i。
- u 表示从当前地址往后请求的字节数,默认是4个bytes。(b单字节,h双字节,w四字节,g八字节)
- <addr> 表示一个内存地址。
例如:以两字节为单位显示前面的那个数组的地址后32字节内存信息如下.
(gdb) x /16uh arr
0xbffff4cc: 2 0 4 0 6 0 8 0
0xbffff4dc: 10 0 34032 2052 0 0 0 0
自动显示
在VisualStudio中,可以通过监视窗口动态查看变量的值。在gdb中,也提供了类似的命令display,它的语法是:
display <expr>
display /<fmt> <expr>
display /<fmt> <addr>
expr是一个表达式,fmt表示显示的格式,addr表示内存地址。当你用display设定好了一个或多个表达式后,只要你的程序被停下来(单步跟踪时),GDB会自动显示你所设置的这些表达式的值。
几个相关的命令如下:
undisplay <dnums...> 不显示dispaly
delete display [dnums] 删除自动显示,不带dnums参数则删除所有自动显示,也支持范围删除,如: delete display 1,3-5
disable display <dnums...> 使display失效
enable display <dnums...> 恢复display
info display 查看display信息