这很奇怪。我在一个有一个断点的类上有一个函数,即使该函数的其余部分没有运行,它也会被击中。重现这一点所需的代码量可能在这里发布是不切实际的,但这就是我所看到的:
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}}该功能是私有的,所以我不知道外部代码是如何实现的打电话给它。这是调试器中的错误吗?某种优化魔法?什么可能会发生这样的事情?
答案 0 :(得分:0)
内存损坏可能会导致问题。也许你的代码中某处有一个损坏的指针,这可能是使用它的副作用。 它可以部分解释为什么你不能访问callstack。 只是为了确定...断点是否与您运行的源代码完全相同?即使代码与编译版本不同,也可以进行调试。它会使断点无用。