打印 gdb 中当前语句引用的所有变量符号的值,例如对于 assert(...) 失败

Print values of all variable symbols referenced by current statement in gdb e.g. for assert(...) failures

我相信我们都看过 assert(foo || bar) 并且想知道 foo 是假的还是 bar 是假的。

有什么方法可以说服 gdb 检查这样的表达式 - 即使在调试核心文件时 - 并打印它引用的任何符号的值?更好的是,当使用 -ggdb3?

构建可执行文件时,递归地包括宏扩展

我现在看到的是这样的:

#4  0x0000000000xxxxxx in Foo (....)
    at file:111
111     Assert(foo || bar);

我正在寻找的是能够做到:

(gdb) some_magic_command
  foo: (int32_t) 42
  bar: (int32_t) 0

同样,就好像 echo <<varname>>:ptype <<varname>>p <<varname>> 对于语句中直接引用的每个变量都是 运行。

Assert(foo || bar) 显然是用来说明这一点的任意示例语句。如果我可以编写脚本 p foop bar,就没有问题要问了。

标识和打印的变量不一定在同一个编译单元中,或者在同一个ELF可执行文件中。他们可能是外部人员,可能需要搬迁。当然,它们只有在当前上下文中可以解决时才能显示。

但肯定有办法做到这一点?

有人知道我错过了什么吗?

在 gdb 中没有直接的方法可以做到这一点。 gdb 不知道任何给定语句引用了哪些变量——该信息不在调试信息中。

您可以通过在 Python 中编写一个命令来实现这一点,该命令 (1) 从源代码中提取当前代码行的文本,并且 (2) 使用某种技术从该行的文本。但是,这很难正确执行,尤其是对于 C++。