检查gdb中的模板参数包
Inspect template parameter pack in gdb
我正在尝试调试以下简单程序:
#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
然后用gdb7.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.
我该如何真正审视这些论点?
相关:显示gdb 中参数包的值
这里有两个问题;第一个是g++使用gdb还不支持的标签DW_TAG_GNU_template_parameter_pack
和DW_TAG_GNU_formal_parameter_pack
以DWARF格式发出参数包调试信息(PR链接)。
即使解决了这个问题,我们也会遇到另一个问题,那就是g++发出的调试信息被破坏了;它缺少参数名称(DW_AT_name
)(PR链接)。
TBH-gdb对C++11的支持非常糟糕(这并不奇怪,因为它实际上被放弃了这么长时间);C++11的另一个近乎showstopper的错误是,它直到版本8才支持右值引用(DW_TAG_rvalue_reference_type
),并打印类似<unknown type in /tmp/a.out, CU 0x0, DIE 0x7f>
的错误消息。
解决方法(除了使用clang,或者不使用DW_TAG_GNU_template_parameter_pack
标签的g++的古老版本,例如4.4.7)是使用带有GCC扩展的stabs调试格式:
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++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 我们能否使 GDB 在回溯中显示非平凡的参数
- 什么是clang 选项,以便在GDB中我可以使用std :: cout作为函数参数
- GDB呼叫函数 - 如何使用std :: cout作为参数
- GDB 用户定义函数:如何传递复杂参数
- GDB有没有办法在不省略模板参数的情况下打印类型
- GDB CoreFile不查看功能参数
- gdb只接受第一个参数
- 检查gdb中的模板参数包
- 在回溯跟踪中格式化 GDB 模板参数
- 是否可以将参数作为命令行传递给 GDB
- 无法在 gdb 中使用引用参数调用函数
- 具有非类型参数的类模板的静态成员的 gdb "static field value has been optimized out"
- 用gdb调试基于参数的C程序
- 在 GDB 中隐式使用此参数
- 是否可以使用GDB查看未命名的框架/函数参数