内联函数中的断点未被触发

时间:2012-10-16 09:38:11

标签: c++ visual-studio inline breakpoints

我有一个以下列方式声明的类:

#ifndef MYCLASS_H
#define MYCLASS_H

class MyClass : public MyOtherClass
{

public:
    MyClass();

    int a() const{ return _a; };
    int b() const{ return _b; };

private:
    int _a;
    int _b;
};

inline bool operator==( const MyClass& lhs, const MyClass& rhs )
{
    return (lhs.a() == rhs.a()) && (lhs.b() == rhs.b());
}

#endif

我的问题是,任何断点都是在重载operator==永远不会被命中的情况下设置的,Visual Studio甚至告诉我执行永远不会达到此功能。我遵循this经验法则来重载比较运算符,但除了让它们成为非成员之外,它没有提及任何其他内容,所以我不确定我是否错过了运算符重载或内联的内容功能

有谁能告诉我为什么我的断点永远不被击中?

3 个答案:

答案 0 :(得分:11)

您的断点永远不会被命中,因为编译器正在内联代码。在内联函数内设置断点可能意味着设置数百或数千个“虚拟”断点。跟踪内联代码的内容对于IDE来说只是做了太多工作,结果却没有。

要解决这个问题要么在调试中运行(我认为内联不会发生),要么不内联函数。

您还可以使用/ Od标志进行编译以禁用内联以及所有其他优化(这是它在调试中所做的)。

设置/ Ob0标志应禁止内联发生。但是,出于性能原因,建议不要经常这样做,以便最好在调试中运行。

答案 1 :(得分:3)

由于OP提到他正在使用VS的调试模式,我试图复制这个&它可以被复制。

1>Remove /ZI flag  (no debug infomration) but set it /Zi instead.
2>Disable /Od flag (so no inline) & set it to /Od2.

这样你可以添加正常的断点,因为它实际上是内联的,所以无法进入内联函数断点。

所以克里斯威尔逊,你可以去你的项目财产,并确保你有

1>/ZI flag is set.
2>/Od flag is disabled. 

如果您不知道如何操作,请查看以下两条MSDN链接以获取这两个标志。

http://msdn.microsoft.com/en-us/library/47238hez(v=vs.71).aspx

http://msdn.microsoft.com/en-us/library/958x11bc(v=vs.80).aspx

答案 2 :(得分:0)

inline并不意味着每个呼叫站点都会内联函数体。实际上,即使没有明确定义inline,编译器也可以内联函数。并且一个功能可以在一个呼叫站点中内联,并在另一个呼叫站点中正常呼叫。该指令只是对编译器的一个提示。 Visual Studio调试器可以正常使用内联函数。

我认为这个问题不是由inline指令引起的。尝试删除此指令并在调试器下运行您的代码。为这样的案例编写单元测试非常方便。