在未调用的函数中触发断点

时间:2015-08-18 17:12:45

标签: c++ debugging c++11 visual-studio-2013 breakpoints

这很奇怪。我在一个有一个断点的类上有一个函数,即使该函数的其余部分没有运行,它也会被击中。重现这一点所需的代码量可能在这里发布是不切实际的,但这就是我所看到的:

MyClass.h:

enum OptionsEnum { OPTION_1, OPTION_2 };

struct OptionsStruct
{
    OptionsEnum options;
    int value;
};

class MyClass
{
private:
    Initialize(...);
    Process(const OptionsStruct&);

    OptionsStruct m_Options { };
}

MyClass.cpp:

#include "MyClass.h"

void MyClass::Initialize(...)
{
    ...do some stuff with local variables... //<--Breakpoint here not triggered
    ...do some more stuff...

    Process(m_Options); //<--Breakpoint here is triggered!  How?!

    ...do yet more stuff... //<--Breakpoint here not triggered
}

void MyClass::Process(const OptionsStruct& options)
{
    ...do some other stuff... //<--Breakpoint here not triggered
}

我已经看到很多帖子都有相反的问题,他们期望被击中的断点被优化掉,因此从未被触发,但我无法想到反向可能如何:优化使得断点在一个从未被调用的函数中间被击中。

单步执行代码表明它实际上从未进入Initialize()函数,但是当使用断点运行时,它会触发它。可以肯定的是,我甚至关闭了优化并让它运行,它仍然会遇到断点。而且只有那个断点。我在函数中的每一行代码上都放了一个断点,只有那一个命中。 Process()中的断点也不会触发,即使它被触发的那条线调用。

模式似乎只有在其中包含成员变量的行才会被击中。当他们这样做时,如果你鼠标悬停在m_Options上,那么结构中的所有字段都是垃圾(未初始化)值。

callstack没有帮助 - 它只指向[External Code][Frames below may be incorrect and/or missing...]以下{{1}}该功能是私有的,所以我不知道外部代码是如何实现的打电话给它。这是调试器中的错误吗?某种优化魔法?什么可能会发生这样的事情?

1 个答案:

答案 0 :(得分:0)

内存损坏可能会导致问题。也许你的代码中某处有一个损坏的指针,这可能是使用它的副作用。 它可以部分解释为什么你不能访问callstack。 只是为了确定...断点是否与您运行的源代码完全相同?即使代码与编译版本不同,也可以进行调试。它会使断点无用。