在使用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