打印 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 foo
和 p bar
,就没有问题要问了。
标识和打印的变量不一定在同一个编译单元中,或者在同一个ELF可执行文件中。他们可能是外部人员,可能需要搬迁。当然,它们只有在当前上下文中可以解决时才能显示。
但肯定有办法做到这一点?
有人知道我错过了什么吗?
在 gdb 中没有直接的方法可以做到这一点。 gdb 不知道任何给定语句引用了哪些变量——该信息不在调试信息中。
您可以通过在 Python 中编写一个命令来实现这一点,该命令 (1) 从源代码中提取当前代码行的文本,并且 (2) 使用某种技术从该行的文本。但是,这很难正确执行,尤其是对于 C++。
我相信我们都看过 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 foo
和 p bar
,就没有问题要问了。
标识和打印的变量不一定在同一个编译单元中,或者在同一个ELF可执行文件中。他们可能是外部人员,可能需要搬迁。当然,它们只有在当前上下文中可以解决时才能显示。
但肯定有办法做到这一点?
有人知道我错过了什么吗?
在 gdb 中没有直接的方法可以做到这一点。 gdb 不知道任何给定语句引用了哪些变量——该信息不在调试信息中。
您可以通过在 Python 中编写一个命令来实现这一点,该命令 (1) 从源代码中提取当前代码行的文本,并且 (2) 使用某种技术从该行的文本。但是,这很难正确执行,尤其是对于 C++。