让GDB显示模板参数的类型

Spa*_*ose 2 c++ templates gdb

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

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

所以我到达了断点,我想知道T是什么类型。我怎样才能做到这一点?

Tom*_*mey 6

如果您的编译器为模板参数发出正确的调试信息(对于非可变参数模板,gcc 已经这样做了好几年),您可以T像普通类型一样引用,例如使用ptype.

我尝试了这个测试程序:

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

int main()
{
  return f<int>();
}
Run Code Online (Sandbox Code Playgroud)

编译并-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
Run Code Online (Sandbox Code Playgroud)


ks1*_*322 6

只需输入framegdb提示符:

(gdb) frame
Run Code Online (Sandbox Code Playgroud)

函数名称和模板参数将显示在输出的第一行。参见在线文档

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