Visual Studio - 为什么断点在我的C++代码中跳转

visual studio - Why a breakpoint jumps in my C++ code?

本文关键字:代码 C++ 我的 Studio 为什么 断点 Visual      更新时间:2023-10-16

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.
}

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

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

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

这就是它的工作原理。

在您的特定情况下,您并没有真正对错误代码执行任何操作,只是将其分配给 if 语句的局部变量。在发布模式下,该行和整个if将被优化掉,因为它没有效果。因此,您可以将值输出到下一行的控制台或在if之前声明err_code,在这种情况下,它在关闭}之后仍将"活动"。