Ошибка: целевой процесс завершился с кодом "code" при вычислении функции "function"

Полный текст сообщения: целевой процесс завершился с кодом "code" при оценке функции "функция".

Чтобы упростить проверку состояния для объектов .NET, отладчик автоматически выполняет дополнительный код в отлаживаемом процессе (обычно это методы получения свойств и функции ToString). В большинстве сценариев эти функции выполняются успешно или вызывают исключения, которые обрабатываются отладчиком. Но в некоторых обстоятельствах исключения невозможно перехватить: например, они пересекают границы ядра, требуют передачи сообщений пользователю или являются неустранимыми. В таком случае метод получения свойств или метод ToString, в котором выполняемый код явным образом завершает процесс (например, вызывает ExitProcess()) или создает необработанное исключение (например, StackOverflowException), автоматически завершает отлаживаемый процесс и весь сеанс отладки. Если вы увидите указанное выше сообщение об ошибке, значит возникла именно такая ситуация.

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

Исправление ошибки

Для этой проблемы есть два возможных решения.

Решение #1. Запретить отладчику вызывать свойство getter или метод ToString

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

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

  • Укажите в методе любой другой тип кода, кроме метода получения свойств и метода ToString, и проблема исчезнет. –или–
  • (Для ToString) Определите для типа атрибут DebuggerDisplay, чтобы отладчик мог вычислить другое значение, кроме ToString. –или–
  • (Для метода получения свойства) Установите для свойства атрибут [System.Diagnostics.DebuggerBrowsable(DebuggerBrowsableState.Never)]. Это может быть полезно, если какой-то из ваших методов должен оставаться свойством для обеспечения совместимости с API, хотя по сути является настоящим методом.

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

Решение #2. Отключение всех неявных вычислений

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