在调试valgrind与gdb一起运行时,如何使用变量名而不是地址?

时间:2014-04-30 00:21:18

标签: gdb valgrind

让我们通过以下方式调试valgrindgdb

$ valgrind --vgdb-error=0 ./magic

...然后在第二个终端:

$ gdb ./magic
...
(gdb) target remote | /usr/lib/valgrind/../../bin/vgdb

如果我想检查某些内存的定义,我可以使用:

(gdb) p &batman
$1 = (float *) 0xffeffe20c
(gdb) p sizeof(batman)
$2 = 4
(gdb) monitor get_vbits 0xffeffe20c 4
ffffffff

使用三个命令做一件事有点烦人,特别是因为我通常想对同一堆栈帧中的许多不同变量进行几次这样的操作。但是,如果我尝试这个显而易见的事情,我会得到:

(gdb) monitor get_vbits &batman sizeof(batman)
missing or malformed address

是否可以让gdb评估与&batman命令在同一行上的sizeof(batman)monitor

1 个答案:

答案 0 :(得分:5)

  

但是,如果我尝试显而易见的事情,我会得到:地址丢失或格式错误

这是来自监视器cmd的GDB doc(http://sourceware.org/gdb/onlinedocs/gdb/Connecting.html#index-monitor-1210):

  

monitor cmd

     

此命令允许您发送任意命令   直接到远程监控器。由于gdb不关心   它发送的命令就像这样,这个命令是扩展gdb-you的方法   可以添加只有外部监视器才能理解的新命令   并实施。

正如您所看到的那样“gdb并不关心它发送的命令”。这可能意味着monitor之后的命令没有以任何方式处理并按原样发送。

在同一行上评估变量的方法是在gdb(http://sourceware.org/gdb/onlinedocs/gdb/Define.html)中使用用户定义的命令。定义您自己的命令并使用eval gdb命令为您的命令准备必要的值(http://sourceware.org/gdb/current/onlinedocs/gdb/Output.html#index-eval-1744):

define monitor_var
  eval "monitor get_vbits %p %d", &$arg0, sizeof($arg0)
end

然后像这样使用它:

(gdb) monitor_var batman