Udostępnij za pośrednictwem


invalidCERCall MDA

Uwaga

Ten artykuł jest specyficzny dla programu .NET Framework. Nie ma zastosowania do nowszych implementacji platformy .NET, w tym .NET 6 i nowszych wersji.

Asystent invalidCERCall debugowania zarządzanego (MDA) jest aktywowany, gdy istnieje wywołanie w grafie regionu wykonywania ograniczonego (CER) do metody, która nie ma kontraktu niezawodności lub zbyt słabego kontraktu. Słaby kontrakt to kontrakt, który deklaruje, że uszkodzenie stanu najgorszego przypadku jest o większym zakresie niż wystąpienie przekazane do wywołania, czyli AppDomain stan procesu lub może zostać uszkodzony lub że jego wynik nie zawsze jest deterministycznie skomponowany w przypadku wywołania w cer.

Objawy

Nieoczekiwane wyniki podczas wykonywania kodu w cer. Objawy nie są specyficzne. Mogą to być nieoczekiwane OutOfMemoryExceptionwyjątki , lub inne wyjątki podczas wywołania metody zawodnej, ThreadAbortExceptionponieważ środowisko uruchomieniowe nie przygotowało go przed upływem czasu lub chroniło je przed ThreadAbortException wyjątkami w czasie wykonywania. Większe zagrożenie polega na tym, że każdy wyjątek wynikający z metody w czasie wykonywania może pozostawić AppDomain proces lub w stanie niestabilnym, co jest sprzeczne z celem CER. Przyczyną utworzenia cer jest uniknięcie takich uszkodzeń stanu. Objawy stanu uszkodzenia są specyficzne dla aplikacji, ponieważ definicja spójnego stanu różni się między aplikacjami.

Przyczyna

Kod w cer wywołuje funkcję bez ReliabilityContractAttribute lub ze słabym ReliabilityContractAttribute , który nie jest zgodny z uruchamianiem w cer.

Jeśli chodzi o składnię kontraktu niezawodności, słaby kontrakt jest kontraktem Consistency , który nie określa wartości wyliczenia lub określa Consistency wartość MayCorruptProcess, MayCorruptAppDomainlub None. Każdy z tych warunków wskazuje, że wywoływany kod może utrudniać wysiłki innego kodu w CER w celu zachowania spójnego stanu. Reguły ceR umożliwiają kodowi traktowanie błędów w bardzo deterministyczny sposób, utrzymywanie wewnętrznych zmiennych, które są ważne dla aplikacji i umożliwienie jej kontynuowania działania w obliczu przejściowych błędów, takich jak wyjątki poza pamięcią.

Aktywacja tego MDA wskazuje na możliwość, że wywoływana metoda w CER może zakończyć się niepowodzeniem w sposób, w jaki obiekt wywołujący nie spodziewał się lub pozostawia AppDomain stan procesu uszkodzony lub nieodwracalny. Oczywiście wywołany kod może zostać wykonany poprawnie, a problem jest po prostu brakującą umową. Jednak problemy związane z pisaniem niezawodnego kodu są subtelne, a brak kontraktu jest dobrym wskaźnikiem, że kod może nie zostać poprawnie wykonany. Kontrakty są wskaźnikami, że programista kodował niezawodnie, a także obiecuje, że te gwarancje nie zmienią się w przyszłych poprawkach kodu. Oznacza to, że kontrakty są deklaracjami intencji, a nie tylko szczegółami implementacji.

Ponieważ każda metoda ze słabym lub nieistniejącym kontraktem może potencjalnie zakończyć się niepowodzeniem na wiele nieprzewidywalnych sposobów, środowisko uruchomieniowe nie próbuje usunąć żadnych własnych nieprzewidywalnych niepowodzeń z metody wprowadzonej przez leniwy kompilowanie JIT, populację słownika ogólnego lub przerwanie wątku, na przykład. Oznacza to, że po aktywowaniu tego rozwiązania MDA oznacza to, że środowisko uruchomieniowe nie uwzględniło wywoływanej metody w zdefiniowanym cer; wykres wywołań został zakończony w tym węźle, ponieważ dalsze przygotowanie tego poddrzewa pomoże zamaskować potencjalny błąd.

Rozwiązanie

Dodaj prawidłowy kontrakt niezawodności do funkcji lub unikaj używania tego wywołania funkcji.

Wpływ na środowisko uruchomieniowe

Skutkiem wywołania słabego kontraktu z CER może być niepowodzenie CER do ukończenia operacji. Może to prowadzić do uszkodzenia AppDomain stanu procesu.

Wyjście

Poniżej przedstawiono przykładowe dane wyjściowe z tej usługi MDA.

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.

Konfigurowanie

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

Zobacz też