gpt4 book ai didi

c++ - 在 gdb 中检查模板参数包

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:28:31 24 4
gpt4 key购买 nike

我正在尝试调试以下简单程序:

#include <iostream>

template <class... Args>
void printAll(Args&&... args) {
using swallow = int[];
swallow{0,
(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 swallow{0,
(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.

我如何实际检查参数?

最佳答案

相关: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 swallow{0,
(gdb) p 'args#0'
$1 = (int &) @0x7fffffffe45c: 1

关于c++ - 在 gdb 中检查模板参数包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36407941/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com