为什么断点会在我的 C++ 代码中跳转?
Why a breakpoint jumps in my C++ code?
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 window 中设置 @err,hr
来查找最后的错误信息,但断点行为对我来说很有趣。
VS 与 C++ 和 C# 的行为不同。在 C++ 的情况下,调试器将忽略不包含任何实际代码的行,并将继续移动断点,直到它遇到包含一些代码的行。
一个有点相关的行为是,如果您尝试在发布模式下进行调试,许多行将被优化掉,除非您知道发生了什么,否则会发现更多的怪异之处。
这就是它的工作原理。
在您的特定情况下,您实际上并没有对错误代码执行任何操作,只是将其分配给 if
语句的局部变量。在发布模式下,该行甚至整个 if
都将被优化掉,因为它没有任何效果。因此,您可以在以下行中将值输出到控制台,或者在 if
之前声明 err_code
,在这种情况下,在结束 }
之后它仍然是 'alive'。
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 window 中设置 @err,hr
来查找最后的错误信息,但断点行为对我来说很有趣。
VS 与 C++ 和 C# 的行为不同。在 C++ 的情况下,调试器将忽略不包含任何实际代码的行,并将继续移动断点,直到它遇到包含一些代码的行。
一个有点相关的行为是,如果您尝试在发布模式下进行调试,许多行将被优化掉,除非您知道发生了什么,否则会发现更多的怪异之处。
这就是它的工作原理。
在您的特定情况下,您实际上并没有对错误代码执行任何操作,只是将其分配给 if
语句的局部变量。在发布模式下,该行甚至整个 if
都将被优化掉,因为它没有任何效果。因此,您可以在以下行中将值输出到控制台,或者在 if
之前声明 err_code
,在这种情况下,在结束 }
之后它仍然是 'alive'。