为什么断点会在我的C ++代码中跳转?

时间:2015-06-17 06:46:31

标签: c++ visual-studio visual-c++

MS Visual Studio 2013.

我看到我的断点正在运行时(C ++代码)。我的C#代码中从来没有这样的行为,为什么我在C ++中得到这个?我该如何解决?

#include <Windows.h>
int main(){
  HANDLE hFile = ::CreateFile(TEXT(""), 0, 0, NULL, OPEN_EXISTING, 0, NULL);
  if (INVALID_HANDLE_VALUE == hFile){
    DWORD err_code = ::GetLastError();
  } // In the IDE I set the breackpoint on this line for err_code value looking...
  return(0); // but in runtime the breackpoint moved to this line.
             // It moved back when the work finished.
}

我知道在这种情况下我可以在Watch窗口中设置@err,hr以查找最后一个错误信息,但断点行为对我来说很有意思。

1 个答案:

答案 0 :(得分:4)

VS与C ++和C#的行为不同。对于C ++,调试器将忽略不包含任何实际代码的行,并将继续移动断点,直到它到达包含某些代码的行。

一个有点相关的行为是,如果你试图在发布模式下进行调试,很多行都会被优化掉,除非你知道发生了什么,否则会有更多的怪异。

这就是它的工作原理。

在您的具体情况下,您并未真正对错误代码执行任何操作,只需将其分配给if语句的本地变量即可。在发布模式中,该行和整个if将被优化掉,因为它没有效果。因此,您可以将值输出到以下行的控制台,或者在err_code之前声明if,在这种情况下,它仍然会活跃在&#39;在结束}之后。