检查 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),打印错误消息,如 &lt;unknown type in /tmp/a.out, CU 0x0, DIE 0x7f&gt;

解决方法(除了使用 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 中的模板参数包的主要内容,如果未能解决你的问题,请参考以下文章

根据 Derived 中的值检查基类的模板参数

C++11 ——— 可变参数模板

C++11 ——— 可变参数模板

带有 URL 参数的 Django 模板检查值

第20课 可变参数模板_模板参数包和函数参数包

函数模板参数包后跟模板参数和特化