Невозможно вычислить ошибку выражения

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

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

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

Флажок "Оптимизировать код" на вкладке сборки свойств проекта снят.


person Sorskoot    schedule 25.12.2009    source источник
comment
у меня такая же проблема   -  person user    schedule 28.04.2012


Ответы (3)


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

Цитата

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

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

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

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

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

Цитата

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

person John Alexiou    schedule 08.11.2010
comment
+1 Это ПРАВИЛЬНЫЙ ответ. Изменение ByVal на ByRef решило проблему. - person nalply; 03.04.2013
comment
Ответ правильный. Рассчитать размер структуры. Скорее всего, это более 256 байт. В случае, с которым я столкнулся, я использовал в структуре множество десятичных свойств, которые в сумме превысили ограничение в 256 байтов. Рефакторинг от decimal до int — это все, что нужно, чтобы все заработало. - person Diizzy; 12.06.2015

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

person Sorskoot    schedule 11.01.2010

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

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

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

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

person Tom Bushell    schedule 18.09.2012