Отладчик Visual Studio 2010 имеет проблемы с отслеживанием местоположения переменных памяти. Иногда это может ввести вас в заблуждение, потому что VS2010 НЕ показывает переменную, которую вы думаете, она показывает вам.
Например, если вы повторно используете имя переменной внутри функции, то какая ячейка памяти должна отображаться в окне наблюдения ИЗМЕНЕНИЯ при изменении области выполнения:
for (int i=0; i<10; i++) {
i=i+1; // do something, what isn't important
}
int i;
for (i=0; i<5; i++) {
i=i+1; // do something
}
printf("i=%d\n", i);
Теперь поместите переменную i в окно просмотра.
Очевидно, что значение i (или значение) отображается в окне просмотра. Если вы запустите программу, то увидите, что когда она входит в цикл for, часы отслеживают переменную i цикла for. Когда он выходит из цикла for, а затем нажимает на приведенный ниже код с другой переменной с тем же именем, окно наблюдения не отслеживает память этой переменной.
Вы увидите окно наблюдения, все еще заявляющее, что я равен 10, хотя во 2-м цикле я теперь равен 0,1,2, … и после 2-го цикла я на самом деле равен 6, но окно наблюдения по-прежнему объявляет, что я равен 10.
А что делать с окном часов? Я бы сказал, что он всегда должен показывать вам значение переменной с этим именем наблюдения, которое находится в области видимости, так как правила языка говорят, что только одна из этих переменных находится в области видимости в любой момент времени.
Его ошибка в функциональности окна часы отладчика здесь (VS2010, кажется, дешевле просто найти первую переменную в функции, которая совпадает с именем вы дали его в часы, и упорно смотреть, что пространство памяти, независимо от того, что еще может быть в коде , даже если новая переменная с тем же именем перешла в область видимости (в этот момент окно наблюдения теперь лежит на вас!)
Пока я на VS2010, и мне нужно остаться там, и MSFT не устранит ошибку в старых версиях, я хотел бы знать, существует ли эта ошибка в VS2013. Возможно, я скоро смогу установить VS2013 параллельно, но стоит указать, чтобы другие не вводили в заблуждение тем, что в окне наблюдения указано значение переменной. (что еще хуже, когда вы наводите курсор мыши на имя переменной в коде отладчика, это неправильное значение отображается как «подсказка»).
У меня одна и та же проблема несколько раз на VS 2013 🙁
Вы всегда можете открыть окно дизассемблирования и проверить, что действительно увеличивает программа. Вы должны увидеть, является ли это адресом стека (скорее всего, в режиме отладки) или регистром.
Вы можете сбросить значение регистра в непосредственном окне или непосредственно в окне просмотра. То же самое с адресом стека. Просто введите то, что вы видите в окне разборки. Например:
00DC4095 mov eax,dword ptr [i]
00DC4098 add eax,1
00DC409B mov dword ptr [i],eax
перерыв в 00DC409B и дамп eax.