当我使用模板调试函数时,
如何知道当前函数使用的模板类型?
我试过了p T
。它说gdb不能打印一种类型。
如何打破特定的模板类型?
假设函数foo<T>(...)
有两种可能的形式,foo<int>(...)
和foo<long>(...)
。如何设置断点以便gdb仅在使用int
的第一个断点上暂停,而不是在使用long
的第二个断点暂停?
编辑:如果可以通过行号设置断点,那将是很好的。这有很多很好的理由,例如。函数的初始部分可能需要很长时间才能运行,我希望调试的地方可能在if
语句中等。
答案 0 :(得分:3)
您可以使用ptype
而不是p
来打印类型。最近有足够的(几年前)g ++和gdb,这将有效。
考虑这个来源:
#include <iostream>
template<typename T>
struct S
{
S(T t)
{
std::cout << t;
}
};
int main()
{
S<const char*> s2("hello");
S<int> s1(23);
return 0;
}
在这里,我可以进入s2
的构造函数,并查看T
:
(gdb) ptype T
type = const char *
看一下当前的框架:
(gdb) frame
#0 S<char const*>::S (this=0x7fffffffe35f, t=0x400940 "hello") at q.cc:8
8 std::cout << t;
我可以使用那里给出的函数名设置断点:
(gdb) b S<const char *>::S
Breakpoint 2 at 0x40087a: file q.cc, line 8.
答案 1 :(得分:3)
要为所有实例设置断点,请使用:
gdb> rbreak Foo<.*>
仅在已知实例上设置断点
gdb> break Foo<int>
你也可以使用rbreak Foo<int>
,但是使用一个调用正则表达式的调用是没有意义的,但你没有给出: - )
示例代码:
#include <iostream>
#include <string>
template < typename T>
T Foo(T t) { return t; }
int main()
{
std::cout << Foo<int>(1) << std::endl;
std::cout << Foo<std::string>("Hallo") << std::endl;
}
只需使用调试信息进行编译:
g++ main.cpp -g -o go
运行gdb:
gdb go
并测试:
gdb> rbreak Foo<int>
gdb> run
gdb> backtrace
gdb> cont
如您所见:只有一个模板实例受到影响。
在回溯中,您可以看到调用了哪个模板实例:
#0 Foo<int> (t=1) at main.cpp:5
#1 0x0000000000400b69 in main () at main.cpp:9
正如你在这里看到的那样Foo<int>
。