C++ 调试c++;带有gdb的模板
当我使用模板在函数内部调试时C++ 调试c++;带有gdb的模板,c++,gdb,C++,Gdb,当我使用模板在函数内部调试时 如何知道当前函数使用的模板类型 我试过pt。它说gdb不能打印字体 如何在特定模板类型上断开 假设函数foo(…)有两种可能的形式,foo(…)和foo(…)。如何设置断点,使gdb只在使用int的第一个断点上暂停,而不在使用long的第二个断点上暂停 编辑:如果断点可以按行号设置就好了。有很多很好的理由,例如,函数的初始部分可能需要很长时间才能运行,我希望调试的位置可能在if语句中等。您可以使用ptype而不是p打印类型。对于最近的(几年前的)g++和gdb,
pt
。它说gdb不能打印字体
foo(…)
有两种可能的形式,foo(…)
和foo(…)
。如何设置断点,使gdb只在使用int
的第一个断点上暂停,而不在使用long
的第二个断点上暂停
编辑:如果断点可以按行号设置就好了。有很多很好的理由,例如,函数的初始部分可能需要很长时间才能运行,我希望调试的位置可能在
if
语句中等。您可以使用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;
}
查看当前帧:
(gdb) frame
#0 S<char const*>::S (this=0x7fffffffe35f, t=0x400940 "hello") at q.cc:8
8 std::cout << t;
(gdb)帧
#0 S::S(this=0x7fffffffe35f,t=0x400940“你好”)在q.cc:8
8 std::cout要为所有实例设置断点,请使用:
gdb> rbreak Foo<.*>
运行gdb:
gdb go
和测试:
gdb> rbreak Foo<int>
gdb> run
gdb> backtrace
gdb> cont
gdb>rbreak Foo
gdb>运行
gdb>回溯
gdb>cont
如您所见:只有一个模板实例受到影响
在回溯中,您可以看到调用了哪个模板实例:
#0 Foo<int> (t=1) at main.cpp:5
#1 0x0000000000400b69 in main () at main.cpp:9
main.cpp:5处的0 Foo(t=1)
#main()中的1 0x0000000000400b69位于main.cpp:9
正如你所看到的,这里是
Foo
。我今天在工作中这样做了,我很确定bfoo
会起作用。。。如果你做了b foo.cpp:123
(假设第123行是foo
的那一行,它将为所有模板变量设置多个断点。您所处的模板实例化应该在回溯中可见。我更新了ptype
部分以打印有趣的内容,即ptype T
而不是ptype S
e答案。您可以按行号设置断点,但问题是根据类型对其进行过滤。这可以通过一些Python脚本完成;基本上,您需要一个新的方便函数来检查类型。啊,如果b Foo
默认为与rbreak Foo
相同的所有实例,那就更好了。
#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 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