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

det*_*tly 1 gdb valgrind

假设我正在调试valgrindgdb执行:

$ valgrind --vgdb-error=0 ./magic
Run Code Online (Sandbox Code Playgroud)

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

$ gdb ./magic
...
(gdb) target remote | /usr/lib/valgrind/../../bin/vgdb
Run Code Online (Sandbox Code Playgroud)

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

(gdb) p &batman
$1 = (float *) 0xffeffe20c
(gdb) p sizeof(batman)
$2 = 4
(gdb) monitor get_vbits 0xffeffe20c 4
ffffffff
Run Code Online (Sandbox Code Playgroud)

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

(gdb) monitor get_vbits &batman sizeof(batman)
missing or malformed address
Run Code Online (Sandbox Code Playgroud)

是否有可能与我的命令gdb进行评估&batmansizeof(batman) 在同一行monitor

Ser*_*kov 5

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

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

monitor cmd

此命令允许您将任意命令直接发送到远程监视器.由于gdb不关心它发送的命令,这个命令是扩展gdb的方法 - 你可以添加只有外部监视器才能理解和实现的新命令.

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

您可以在同一行上评估变量的方法是在gdb中使用用户定义的命令(http://sourceware.org/gdb/onlinedocs/gdb/Define.html).定义您自己的命令并使用evalgdb命令为您的命令准备必要的值(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
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

(gdb) monitor_var batman
Run Code Online (Sandbox Code Playgroud)