Visual Studio перемещает точки останова - PullRequest
6 голосов
/ 22 февраля 2012

Первоначально я использовал Visual Studio C ++ Express, я переключился на окончательный вариант, и в настоящее время я не уверен, почему отладчик перемещает мои контрольные точки, например:

if(x > y) {
    int z = x/y;         < --- breakpoint set here
}
int h = x+y;             < --- breakpoint is moved here during run time

или

random line of code      < --- breakpoint set here
random line of code

return someValue;        < --- breakpoint is moved here during run time

Кажется, это происходит в случайных местах кода.Здесь когда-нибудь я делаю не так?У меня никогда не было проблем с экспресс-версией, как это происходит.

1 Ответ

10 голосов
/ 22 февраля 2012

Вы отлаживаете в режиме выпуска.

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, вы не можете установить точку останова там.

Следующее генерируется при компиляции в режиме релиза:

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)]

Чтобы проверить это, вы можете выполнить это простое изменение:

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