我正在尝试通过GDB在C ++中的模板函数中设置断点我尝试了三种可能的方法。
总体目标是使用如下所示的脚本通过GDB跟踪完整的代码流,但是我的代码也具有许多模板功能。下面的示例GDB脚本
set logging on
b func2
commands
silent
bt 1
continue
end
b func1
commands
silent
bt 1
set logging off
continue
end
[能否请您提出正确的解决方案或让我知道我是否缺少某些东西?非常感谢您的帮助/建议,并大大简化了我的调试。
非常感谢!
问题很可能是您尝试在gdb中设置断点时使用的函数名。
gdb使用的函数名称不是源文件中的名称,而是二进制文件中的名称。模板函数实际上不是函数。它们只是“配方”,当您使用模板实际编译代码时,编译器将使用配方为您实现一个功能(对于您实际使用的每种模板参数组合,一个功能)。
考虑下面的代码
#include <iostream>
double tripleInput(double x) { return 3 * x; }
template <typename T>
inline T doubleInput(const T& x) {
return 2 * x;
}
int main(int argc, char *argv[])
{
std::cout << doubleInput(13) << std::endl;
std::cout << doubleInput(1.72) << std::endl;
std::cout << tripleInput(1.72) << std::endl;
return 0;
}
当我们编译它并在gdb中调试时,gdb将看到三个函数(main
除外)。tripleInput
,doubleInput<int>
和doubleInput<double>
。如果您使用gdb break tripleInput
编写,则会在tripleInput
函数中添加一个断点,但是如果您仅编写break doubleInput
gdb,则会说该函数未定义。
您需要编写break doubleInput<int>
或break doubleInput<int>
,但是请注意,添加这样的断点只会在模板的特定实例中停止。它与在模板中的行上添加断点不同。在这种情况下,gdb实际上会添加带有multiple location的断点。使用两种方法创建断点后,尝试info breakpoints
,以查看不同之处。
我不知道可以做诸如break doubleInput<*>
之类的事情,但是从文档中看,似乎不可能。