Неправильные значения наблюдения в Visual Studio 2010 Professional - PullRequest
3 голосов
/ 02 сентября 2011

У меня действительно странная проблема, когда значения окна наблюдения для некоторых переменных, кажется, не соответствуют их значениям "реального мира".Отладчик просто выключен в космосе.Вот самый маленький фрагмент кода, который показывает это:

printf("%d", pNodes[nNode].nColumn); // watch shows "4"
printf("%d", nColumn); // watch shows "1"

if (pNodes[nNode].nColumn != nColumn)
  continue; // this is NOT called

Итак, вот поведение:

  1. Если я добавлю часы к pNodes[nNode].nColumn, они показывают значение 4.
  2. Если я добавляю часы к nColumn, они показывают значение 1.
  3. Если я проверяю выражение pNodes[nNode].nColumn != nColumn в окне часов, оно оценивается как true.
  4. Оператор continue пропущен!
  5. Я добавил вызовы printf(), чтобы посмотреть, что происходит, и printf() напечатает значения 1 и 1, который, кажется, согласуется с тем, как код "течет" (то есть он не вызывает continue внутри оператора if.

Я могу дажепроверьте память на &pNodes(nNode].nColumn, и она покажет «неправильные» значения, которые показывает мне окно наблюдения. Поэтому кажется, что отладчик полностью «отключен» от фактических данных программы или чего-то в этом роде. Я запускаюоптимизация отладочной сборки отключена.Я также проверил, что pNodes не соответствует какой-либо глобальной переменной или другимПеременная выше по объему - кажется, есть только локальная версия.

Это совершенно сбивает с толку меня!Я даже не уверен, куда идти дальше, чтобы попытаться выяснить проблему.Если у вас есть какие-либо идеи, я бы хотел их услышать!

Спасибо!

Ответы [ 3 ]

5 голосов
/ 02 сентября 2011

Так что я думаю, что взломал дело: виновник был Выравнивание членов структуры . У меня было несколько проектов, смешанных вместе, и некоторые из них имели разные значения для этого поля внутри проектов. Я удалил настройки на всех них, чтобы позволить VS выбрать настройки по умолчанию, и проблема исчезла.

Применимое значение было между 4 байта в некоторых проектах, По умолчанию в некоторых проектах и ​​вообще пустым в других. Значение находится под Свойства конфигурации / C / C ++ / Генерация кода / Выравнивание элементов структуры . Опять же, я просто удалил значения для проектов. Я думаю, что это было задано для проектов в некоторый момент в прошлом для решения какой-то кроссплатформенной проблемы, но по крайней мере это исправлено для работы, которую я делаю сейчас!

Спасибо за вашу помощь!

2 голосов
/ 02 сентября 2011

Если часы устанавливаются с использованием переменных, не входящих в область видимости, то такое поведение я наблюдаю все время в Visual Studio. Это действительно должно сказать "<не в области>" или что-то более полезное.

Если вы проходите через эти строки кода и все еще видите эти призрачные значения, я не знаю: вы уверены это отладочная сборка?

0 голосов
/ 02 августа 2014

В отладчике 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.

И что должно Окно часов делать?Я бы сказал, что он всегда должен показывать вам значение переменной с этим именем наблюдения, то есть в области действия , так как правила языка говорят вам, что только одна из этих переменных находится в области действия в любой момент времени.

1023 * его ошибка в функциональности окна часы отладчика здесь (VS2010, кажется, дешевле просто найти первую переменную в функции, которая совпадает с именем вы дали его в часы, и упорно смотреть, что пространство памяти, независимо от того, что ещеможет быть в коде, даже если новая переменная с тем же именем перешла в область видимости (в этот момент окно наблюдения теперь лежит на вас!)
...