Поделиться через


Помощник по отладке управляемого кода invalidCERCall

Помощник по отладке управляемого кода (MDA) invalidCERCall активируется в случае вызова в графе области с ограничением исполнения (CER) метода, не имеющего контракта о надежности или имеющего чрезвычайно слабый контракт о надежности. Слабым контрактом о надежности является контракт, в котором объявляется, что область максимального повреждения состояния больше, чем экземпляр, переданный вызову; то есть состояние объекта AppDomain или процесса может быть повреждено либо их результат не всегда подлежит детерминированному вычислению при вызове в пределах области CER.

Признаки

Непредвиденные результаты выполнения кода в области CER. Данные признаки трудно конкретизировать. Признаком также может являться возникновение непредвиденных исключений OutOfMemoryException, ThreadAbortException или других исключений при вызове ненадежного метода, поскольку среда выполнения не была заранее подготовлена и защищена от возникновения исключений ThreadAbortException во время выполнения. Гораздо большую угрозу представляет собой тот факт, что любое исключение, возникающее в результате вызова метода во время выполнения, может оставить объект AppDomain или процесс в нестабильном состоянии, что противоречит задачам области CER. Область CER была создана именно с целью избежать подобных повреждений состояния. Признаки поврежденного состояния отличаются в зависимости от приложения, поскольку определения согласованного состояния для разных приложений различны.

Причина

Код в области CER вызывает функцию, не имеющую контракта ReliabilityContractAttribute или имеющую слабый контракт ReliabilityContractAttribute, непригодный для работы в пределах области CER.

С точки зрения синтаксиса контракта о надежности, слабый контракт представляет собой контракт, не определяющий значения перечисления Consistency либо указывающий для Consistency значение MayCorruptProcess, MayCorruptAppDomain или None. Любое из данных условий указывает на то, что вызываемый код может отрицательно повлиять на попытки другого кода в области CER поддерживать согласованное состояние. Области CER позволяют коду обрабатывать ошибки детерминировано, управляя внутренними инвариантами, важными для приложения, и позволяя продолжать работу приложения в условиях возникновения временных ошибок, например, исключений нехватки памяти.

Активация данного помощника по отладке управляемого кода указывает на возможность сбоя вызова метода в области CER, непредвиденного для вызывающего объекта, в результате чего возникают устранимые или неустранимые повреждения состояния объекта AppDomain или процесса. Конечно, выполнение вызываемого кода могло быть корректным, и проблема заключается просто в отсутствии контракта. Однако вопросы, связанные с написанием надежного кода, несущественны, и отсутствие контракта является хорошим показателем неправильного выполнения кода. Контракты являются показателями того, что программистом был написан надежный код, а также гарантируют, что степень надежности не уменьшится в результате дальнейших правок кода. То есть контракты представляют собой объявление цели, а не только подробные сведения о реализации.

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

Решение

Следует добавить в функцию действительный контракт о надежности, либо избегать вызова данной функции.

Влияние на среду выполнения

В результате вызова слабого контракта из области CER может возникнуть сбой при завершении работы области CER. Это может стать причиной повреждения состояния процесса AppDomain.

Output

В следующем примере демонстрируется результат действия данного помощника по отладке управляемого кода.

Method 'MethodWithCer', while executing within a constrained execution region, makes a call at IL offset 0x000C to 'MethodWithWeakContract', which does not have a sufficiently strong reliability contract and might cause non-deterministic results.

Конфигурация

<mdaConfig>
  <assistants>
    <invalidCERCall />
  </assistants>
</mdaConfig>

См. также

Ссылки

PrepareMethod

System.Runtime.ConstrainedExecution

Основные понятия

Диагностика ошибок посредством управляемых помощников по отладке