有关的:在 gdb 中显示参数包的值
这里有两个问题;第一个是 g++ 使用标签以 DWARF 格式发出参数包调试信息DW_TAG_GNU_template_parameter_pack and DW_TAG_GNU_formal_parameter_pack,哪个gdb尚不支持(PR 链接).
即使解决了这个问题,我们也会遇到另一个问题,即 g++ 发出的调试信息被破坏了;它是缺少参数名称(DW_AT_name)(公关链接).
说实话,gdb 对 C++11 的支持非常糟糕(这并不奇怪,因为它实际上已经被放弃了这么久); C++11 的另一个近乎令人窒息的错误是不支持右值引用(DW_TAG_rvalue_reference_type) 直到版本 8,打印错误消息,例如<unknown type in /tmp/a.out, CU 0x0, DIE 0x7f>
.
解决方法(除了使用 clang 或不使用DW_TAG_GNU_template_parameter_pack
标签,例如4.4.7) 是使用带有 GCC 扩展的 stats 调试格式:
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 swallow{0,
(gdb) p 'args#0'
$1 = (int &) @0x7fffffffe45c: 1