假设我在一个复杂的模板化C ++代码上运行GDB,我想知道当前实例中的类型是什么......例如:
template <typename T>
void foo ()
{
/// I've got a breakpoint in here somewhere.
}
所以我点击了断点,我想知道T是什么类型的。我怎么能这样做?
答案 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()