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

C++ 在未调用的函数中触发断点,c++,debugging,c++11,visual-studio-2013,breakpoints,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(...); P

这是一个奇怪的。我在一个类上有一个函数,该类中有一个断点,即使函数的其余部分没有运行,它也会被命中。复制此内容所需的代码量可能无法在此处发布,但我看到的是:

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
}
#包括“MyClass.h”
void MyClass::初始化(…)
{

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

内存损坏可能会导致问题。可能在代码中的某个地方有损坏的指针,这可能是使用它的副作用。 它可以部分解释为什么不能访问callstack。

只是为了确定…断点是否与您运行的源代码完全相同?即使代码与编译版本不同,也可以进行调试。这会使断点毫无用处。

确保您在调试模式下编译项目而不进行优化。我可能只猜测您是以发行版或调试版编译的,但进行了优化编译器优化了一些使调试过程变得混乱的方法。在解释<代码> optsStultMyStase{}时,C++编译器(CLX.exe)崩溃了。
line。如果我去掉大括号,一切正常,没有断点。奇怪。@AlexLop。我们实际上做的是相反的-它作为发行版编译,但没有优化。代码的其他部分依赖于它是否在发行版中。我可以试着回去调试,但大约需要20分钟的编译时间(代码库相当庞大)每次你切换模式,所以我不经常这么做。@AustinMullins-你在使用C++11吗?这在C++0x中是不可用的。它基本上只是用每个字段的默认值初始化结构。另外,我也不希望其他人看到仅此代码的相同行为。我们实际的代码库非常大,不可能是的,它是C++11。我可以整天在
\u tmain
中做初始化器列表和lambda的,当我试图在类定义中使用空的初始化器列表时,它只是被弄糊涂了。请确保您在调试模式下编译项目而没有优化。我可能只能猜测您编译为RELEASE或DEBUG但优化和编译器优化了一些使调试过程变得混乱的东西。C++编译器(CLX.exe)在解释<代码> optsStultMyStase{}时崩溃了。line。如果我去掉大括号,一切正常,没有断点。奇怪。@AlexLop。我们实际上做的是相反的-它作为发行版编译,但没有优化。代码的其他部分依赖于它是否在发行版中。我可以试着回去调试,但大约需要20分钟的编译时间(代码库相当庞大)每次你切换模式,所以我不经常这么做。@AustinMullins-你在使用C++11吗?这在C++0x中是不可用的。它基本上只是用每个字段的默认值初始化结构。另外,我也不希望其他人看到仅此代码的相同行为。我们实际的代码库非常大,不可能是的,它是C++11。我可以整天在
\u tmain
中做初始化器列表和lambda的,当我试图在类定义中使用空的初始化器列表时,它被弄糊涂了。是的,它肯定是相同的代码。我做了一次完全的清理/重建,只是为了确保我没有得到过时的代码。你试过吗在程序中的其他位置放置断点,以定位触发问题的代码部分?如果在单步执行wole时问题不存在,可能问题与并发相关。我确实在
Initialize()的每个调用站点放置了断点<或代码>被调用,在断点触发器之前没有一个命中它们。其中一些触发之后,但这是意料之中的行为。只是奇怪的是,函数中间的这一行在函数的任何其他部分或调用它的任何其他函数之前都会命中……这就是为什么我会寻找可能存在的内存损坏的原因。在一个完全不同的代码部分。我在考虑一个场景,您尝试在代码中的某个地方使用指针,但它指向的对象被删除/不存在,现在它指向这一行。执行可能会在debud模式下崩溃,但也有可能在发布时工作。很可能是您损坏了调用堆栈。通常的方法是将C数组声明为函数中的局部变量,然后将其写入超过其大小。然后,当声明该变量的函数尝试返回时,您会得到一个跳转。您应该了解该跳转到达的函数和类可能与问题无关。是的,这是错误的完全相同的代码。我做了一次完整的清理/重建,只是为了确保我没有得到过时的代码。您是否尝试在程序的其他位置放置断点,以定位触发问题的代码部分?如果在执行wole时问题不存在,可能问题与并发相关。我确实
Initialize()所在的每个调用站点上的断点<或代码>被调用,在断点触发器之前没有一个命中它们。其中一些触发之后,但这是预期的行为。这只是奇怪的。函数中间的这一行在函数的任何其他部分或调用它的任何其他函数之前都会命中…这就是为什么我要寻找一个