让GDB显示模板参数的类型

时间:2016-06-03 13:58:43

标签: c++ templates gdb

假设我在一个复杂的模板化C ++代码上运行GDB,我想知道当前实例中的类型是什么......例如:

template <typename T>
void foo ()
{
/// I've got a breakpoint in here somewhere.
}

所以我点击了断点,我想知道T是什么类型的。我怎么能这样做?

4 个答案:

答案 0 :(得分:5)

只需在gdb提示符中输入frame

(gdb) frame

函数名称和模板参数将打印在输出的第一行。见online doc

  

所有这些命令都以打印两行输出描述结束   框架。第一行显示帧号,函数名称,   参数,源文件和执行行号   那个框架。第二行显示该源代码行的文本。

答案 1 :(得分:3)

如果您的编译器为模板参数发出适当的调试信息(对于非可变参数模板,gcc已经执行了多年),您可以引用T,就像它是普通类型一样,例如:与ptype

我尝试了这个测试程序:

template<typename T>
T f()
{
  return 23;
}

int main()
{
  return f<int>();
}

使用-g编译并在f内设置断点:

(gdb) b 4
Breakpoint 1 at 0x4005c5: file q.cc, line 4.
(gdb) r
Starting program: /tmp/q 

Breakpoint 1, f<int> () at q.cc:4
4     return 23;
(gdb) ptype T
type = int

答案 2 :(得分:0)

  

我该怎么做?

这将为您提供当前符号的错位名称:

(gdb) info symbol $pc

这将为您提供解码名称:

(gdb) main demangle symbol_name
(gdb) shell c++filt symbol_name

答案 3 :(得分:0)

你也可以按照以下方式使用正则表达式打破:

(gdb) rbreak foo<.*>()

这也可以应用于模板化类方法

(gdb) rbreak MyClass<.*>::my_method()