要为所有实例设置断点,请使用:
gdb> rbreak Foo<.*>
仅在已知实例上设置断点
gdb> break Foo<int>
你也可以使用 rbreak Foo<int>
,但是如果您没有给出任何正则表达式进行评估,则使用调用witch没有意义 :-)
示例代码:
#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
And test:
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>
。
回答一个评论:
"有没有一种方法可以在特定已知实例的某一行中设置断点?"
有的!
gdb> break main:692
gdb> info break
这将返回类似于以下内容:
Num Type Disp Enb Address What
5 breakpoint keep y <MULTIPLE>
5.1 y 0x00000000004026db in Foo<int>(int) at main.cpp:692
5.2 y 0x00000000004027a6 in Foo<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) at main.cpp:692
(gdb)
现在,您可以通过以下方式禁用特定的实例:
gdb> disable 5.2
您无法删除特定的“子断点”。但禁用是您需要的。如果您喜欢,还可以使用范围实例,例如:
gdb> disable 5.1-2
b foo<int>
可以正常工作... 如果你执行b foo.cpp:123
(假设第123行是foo<T>
的行),它将为所有模板变量设置多个断点。 - Mats Petersson