且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Visual Studio断点被移动

更新时间:2023-02-27 14:18:58

您正在发布模式下调试。

You are debugging in release mode.

if(x > y) {
    //this statement does nothing
    //z is a local variable that's never used
    //no executable code is generated for this line
    int z = x/y;         < --- breakpoint set here
}
//the breakpoint is set on the next executable line
//which happens to be this one
int h = x+y;             < --- breakpoint is moved here during run time

通常调试器在二进制代码中设置钩子。如果没有为 int z = x / y 执行任何二进制代码,则无法在此处设置断点。

Usually debuggers set hooks inside binary code. If no binary code is executed for int z = x/y, you can't set a breakpoint there.

在发布模式下通过编译生成以下内容:

The following is generated by compiling this in release mode:

if(x > y) 
{
    int z = x/y;//         < --- breakpoint set here
}
int h = x+y;
cout << h;
003B1000  mov         ecx,dword ptr [__imp_std::cout (3B203Ch)] 
003B1006  push        7    
003B1008  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (3B2038h)]

要对此进行测试,可以执行以下简单更改:

To test this, you can perform this simple change:

if(x > y) {
    int z = x/y;
    std::cout << z << endl; // <-- set breakpoint here, this should work
}
int h = x+y;