让GDB显示模板参数的类型 我们假设我在一个复杂的模板C++代码上运行GDB,我想知道当前的场景中是什么类型的…例如: template <typename T> void foo () { /// I've got a breakpoint in here somewhere. } 模板 void foo() { ///我这里有个断点。 }

让GDB显示模板参数的类型 我们假设我在一个复杂的模板C++代码上运行GDB,我想知道当前的场景中是什么类型的…例如: template <typename T> void foo () { /// I've got a breakpoint in here somewhere. } 模板 void foo() { ///我这里有个断点。 },c++,templates,gdb,C++,Templates,Gdb,所以我点击了断点,我想知道T是什么类型。我该怎么做 我该怎么做 这将为您提供当前符号的损坏名称: (gdb) info symbol $pc 这将为您提供所需的名称: (gdb) main demangle symbol_name (gdb) shell c++filt symbol_name 如果您的编译器为模板参数发出正确的调试信息(对于非可变模板,gcc已经这样做了好几年),您可以像引用普通类型一样引用T,例如使用ptype 我试过这个测试程序: template<typenam

所以我点击了断点,我想知道T是什么类型。我该怎么做

我该怎么做

这将为您提供当前符号的损坏名称:

(gdb) info symbol $pc
这将为您提供所需的名称:

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

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

我试过这个测试程序:

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

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

只需在gdb提示符中键入
frame

(gdb) frame
函数名和模板参数将打印在输出的第一行。见:

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


您还可以按如下方式使用regexp中断:

(gdb) rbreak foo<.*>()
(gdb)rbreak foo()
这也可以应用于模板化类方法

(gdb) rbreak MyClass<.*>::my_method()
(gdb)rbreak MyClass::my_方法()
(gdb) rbreak MyClass<.*>::my_method()