查看运行时数据

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;
   }

我们可以以如下方式获取函数的返回值:

1. 通过finish命令运行至函数结束,此时会打印函数返回值。

   (gdb) finish
   Run till exit from #0 foo () at main.c:9
   main () at main.c:15
   15 }
Value returned is $2 = 100

2. 返回值会存储在eax寄存器中,通过查看信息可以获取返回值。

   (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信息