Ошибка «Невозможно оценить выражение ...» - PullRequest
2 голосов
/ 25 декабря 2009

Внезапно я получил следующую ошибку при отладке приложений в Visual Studio 2010 бета 2.

"Невозможно оценить выражение, потому что поток останавливается в точке, где сборка мусора невозможна, возможно, потому что код оптимизировано "

Почти каждое свойство или поле в окне наблюдения отображает это сообщение. Кто-нибудь знает что происходит? и как от этого избавиться?

Флажок «Оптимизировать код» на вкладке построения свойств проекта отключен.

Ответы [ 3 ]

6 голосов
/ 08 ноября 2010

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

Цитата

Я думаю, что общая сумма размеров "ссылок" для всех объектов в struct и дополнительные параметры метода были больше 256 байт.

Я получил сообщение от MS по этому вопросу:

"... вообще говоря, когда общий размер аргументов передается функция вызова больше 256 байт, JIT сделает функцию вызова частично прерываемый В частично прерываемом коде не каждый местоположение в коде является безопасной точкой GC. Поэтому может быть небезопасно оценить выражение в определенных местах. Когда это происходит, вы получаете сообщение об ошибке]. "

Так что, похоже, что даже если поля были ссылками, сумма всех их превысил 256 байт предел для отладчика.

У меня также есть ссылка из обсуждения фреймворка OpenTK.

Цитата

Я немного покопался, и кажется, что проблема в том, что структуры данных Math, такие как Matrix или Vector, имеют тип "struct". В C # есть ограничение для типов значений: они не должны превышать 256 байт данных при передаче в качестве аргументов функциям, , если они не переданы по ссылке . Несоблюдение этого требования приводит к появлению бесперебойного кода в режиме отладки. Проблема должна быть решена, если указанные структуры данных преобразуются из структур в классы.

0 голосов
/ 18 сентября 2012

Я тоже это получил, когда нажал исключение NullReferenceException от стороннего элемента управления.

В этом одном случае я обнаружил, что, если я установлю точку останова до , я попаду в исключение, то смогу выполнить один шаг по остальной части кода, не видя проблемы.

Понятия не имею почему, но у меня это сработало - в данном случае, по крайней мере.

Кроме того, я ничего не делал со структурами, как упомянуто @ ja72. Так что, похоже, эта ошибка может возникнуть и в других ситуациях.

0 голосов
/ 11 января 2010

Через несколько дней я заметил, что ошибка исчезла ... Не знаю, что вызвало или разрешило ее ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...