让我们通过以下方式调试valgrind
和gdb
:
$ 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
?
答案 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