首页 > 解决方案 > Qt Creator 不会在具有多个实例化的模板代码中的断点处停止

问题描述

我在 Qt Creator 中遇到了一个看起来像错误的问题,但在提交票证之前,我希望收集更多信息:是否可重现、已知(可能已经有修复)等。

我正在使用基于 Qt 5.14.0 (MSVC 2017) 的 Qt Creator 4.11.0。如果我将断点添加到具有多个实例化的模板代码中,则默认情况下此断点永远不会触发。让我们创建一个简单的应用程序(例如控制台应用程序),定义一个 tempate 函数并在其中添加一个断点:

template<typename T>
T func(T val)
{
    return val * 2; // Put a breakpoint here
}

int main(int argc, char *argv[])
{
    QCoreApplication(argc, argv);
    func(1);
    return a.exec();
}

函数的实现无关紧要,重要的是我们只有一个实例化func<int>。一切都按预期工作,但是如果我们再添加一个实例,就会发生一些变化:

template<typename T>
T func(T val)
{
    return val * 2; // Put a breakpoint here
}

int main(int argc, char *argv[])
{
    QCoreApplication(argc, argv);
    func(1);
    func(1L);
    return a.exec();
}

现在我们有了func<int>and func<long>,这反映在断点视图中(Qt Creator 现在将断点扩展为 2 个子项,每个子项标识实例化的函数)。现在两个断点实例都没有被触发!

有趣的是,但如果我们在调用之前的某个位置func<T>(在非模板代码中)再添加一个断点,调试器将在所有 3 个断点处停止。看起来它需要在第一站执行一些初始化。

这很烦人,因为我main每次计划跟踪代码时都必须添加断点。我从未在过时的 Qt Creator 3.5.1 中遇到过这个问题。这是一个错误,可以在合理的现代版本中复制吗?是否有任何设置可能触发此行为?

标签: c++visual-studio-2017qt-creatorbreakpointstemplate-instantiation

解决方案


推荐阅读