GDB断点未命中模板函数

问题描述 投票:0回答:1

我正在尝试通过GDB在C ++中的模板函数中设置断点我尝试了三种可能的方法。

  1. break fileName:functionName =>适用于非模板函数(特定于一个函数)
  2. rbreak fileName:。 =>给定文件中所有功能的断点,但似乎没有使用模板功能
  3. break fileName:lineNumber =>适用于非模板函数和模板函数,但存在问题对我来说,我每次都必须修改此行号。

总体目标是使用如下所示的脚本通过GDB跟踪完整的代码流,但是我的代码也具有许多模板功能。下面的示例GDB脚本

set logging on
b func2
commands
silent
bt 1
continue
end
b func1
commands
silent
bt 1
set logging off
continue
end
  • 一种选择是使用rbreak filename:。
  • 运行一次代码,然后
  • 再次运行代码而不退出GDB。这次它认识到功能和断点有效。

[能否请您提出正确的解决方案或让我知道我是否缺少某些东西?非常感谢您的帮助/建议,并大大简化了我的调试。

非常感谢!

c++ templates gdb breakpoints
1个回答
0
投票

问题很可能是您尝试在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除外)。tripleInputdoubleInput<int>doubleInput<double>。如果您使用gdb break tripleInput编写,则会在tripleInput函数中添加一个断点,但是如果您仅编写break doubleInput gdb,则会说该函数未定义。

您需要编写break doubleInput<int>break doubleInput<int>,但是请注意,添加这样的断点只会在模板的特定实例中停止。它与在模板中的行上添加断点不同。在这种情况下,gdb实际上会添加带有multiple location的断点。使用两种方法创建断点后,尝试info breakpoints,以查看不同之处。

我不知道可以做诸如break doubleInput<*>之类的事情,但是从文档中看,似乎不可能。

© www.soinside.com 2019 - 2024. All rights reserved.