检查 gdb 中的模板参数包
Posted
技术标签:
【中文标题】检查 gdb 中的模板参数包【英文标题】:Inspect template parameter pack in gdb 【发布时间】:2016-04-04 16:23:24 【问题描述】:我正在尝试调试以下简单程序:
#include <iostream>
template <class... Args>
void printAll(Args&&... args)
using swallow = int[];
swallow0,
(std::cout << args, 0)...
;
int main()
printAll(1, "23", 4);
使用 gcc 4.9.2 编译:
g++ -std=c++11 -g -O0 foo.cxx
然后使用 gdb 7.9 进行调试:
gdb a.out
(gdb) break foo.cxx:5
Breakpoint 1 at 0x400884: file foo.cxx, line 5.
(gdb) run
Starting program: /..[snip]../a.out
Breakpoint 1, printAll<int, char const (&) [3], int>(int&&, char const (&) [3], int&&) () at foo.cxx:6
6 swallow0,
(gdb) bt
#0 printAll<int, char const (&) [3], int>(int&&, char const (&) [3], int&&) () at foo.cxx:6
#1 0x0000000000400813 in main () at foo.cxx:12
我在正确的函数中,但我无法检查参数包:
(gdb) info args
No arguments.
(gdb) print args
No symbol "args" in current context.
(gdb) inspect args
No symbol "args" in current context.
我如何实际检查这些论点?
【问题讨论】:
【参考方案1】:相关:Showing values of parameters packs in gdb
这里有两个问题;首先是g++使用标签DW_TAG_GNU_template_parameter_pack
and DW_TAG_GNU_formal_parameter_pack
发出DWARF格式的参数包调试信息,其中gdb does not yet support (patch attached)。
即使解决了这个问题,我们也会遇到另一个问题,那就是 g++ 发出的调试信息被破坏了;这是missing the parameter name (DW_AT_name
) (patch attached)。
TBH gdb 对 C++11 的支持非常糟糕(这并不奇怪,因为它被有效地放弃了这么久); C++11 的另一个近乎引人注目的错误是它 doesn't support rvalue references (DW_TAG_rvalue_reference_type
) (patch attached),打印错误消息,如 <unknown type in /tmp/a.out, CU 0x0, DIE 0x7f>
。
解决方法(除了使用 clang 或不使用 DW_TAG_GNU_template_parameter_pack
标签的旧版 g++,例如 4.4.7)是使用 stabs debugging format with GCC extensions:
g++ -std=c++11 -gstabs+ -O0 foo.cxx
(gdb) s
void printAll<int, char const (&) [3], int>(int, int&&, char const (&) [3], int&&) (i=999, args#0=@0x7fffffffe45c: 1, args#1=..., args#2=@0x7fffffffe458: 4)
at p.cpp:7
7 swallow0,
(gdb) p 'args#0'
$1 = (int &) @0x7fffffffe45c: 1
【讨论】:
有效!并且令人愉快晦涩难懂。似乎其他问题中的 OP 实际上并没有从链接的答案中得到他想要的东西?认为我们应该关闭那个作为这个的欺骗? 更新了问题跟踪器的链接和补丁。以上是关于检查 gdb 中的模板参数包的主要内容,如果未能解决你的问题,请参考以下文章