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

在使用gdb调试valgrind运行时,如何使用变量名而不是地址?,gdb,valgrind,Gdb,Valgrind,假设我正在通过执行以下操作调试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 (

假设我正在通过执行以下操作调试
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
命令在同一行

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

这来自监视器cmd的GDB doc():

monitor cmd

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

如您所见,“gdb不关心它这样发送的命令”。这可能意味着,
monitor
之后的命令不会以任何方式进行处理,而是按原样发送

要在同一行上计算变量,可以使用gdb()中的用户定义命令。定义您自己的comand,并使用
eval
gdb命令准备具有必要值的命令():

然后像这样使用它:

(gdb) monitor_var batman
(gdb) monitor_var batman