让GDB显示模板参数的类型 我们假设我在一个复杂的模板C++代码上运行GDB,我想知道当前的场景中是什么类型的…例如: template <typename T> void foo () { /// I've got a breakpoint in here somewhere. } 模板 void foo() { ///我这里有个断点。 }
所以我点击了断点,我想知道T是什么类型。我该怎么做 我该怎么做 这将为您提供当前符号的损坏名称:让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
(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()