Udostępnij za pośrednictwem


Diagnozowanie błędów z użyciem asystentów debugowania w zarządzanym środowisku

Uwaga / Notatka

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

Zarządzane asystenty debugowania (MDA) to pomoce debugowania, które współpracują ze środowiskiem uruchomieniowym języka wspólnego (CLR) w celu udostępnienia informacji o stanie środowiska uruchomieniowego. Asystenci generują komunikaty informacyjne dotyczące zdarzeń środowiska uruchomieniowego, których nie można w inny sposób wychwycić. Usługi MDA umożliwiają izolowanie trudnych do znalezienia usterek aplikacji występujących podczas przechodzenia między zarządzanym i niezarządzanym kodem.

Możesz włączyć lub wyłączyć wszystkie MDAs, dodając klucz do rejestru systemu Windows lub ustawiając zmienną środowiskową. Określone usługi MDA można włączyć przy użyciu ustawień konfiguracji aplikacji. W pliku konfiguracji aplikacji można ustawić dodatkowe ustawienia konfiguracji dla niektórych poszczególnych usług MDA. Ponieważ te pliki konfiguracji są analizowane po załadowaniu środowiska uruchomieniowego, należy włączyć usługę MDA przed uruchomieniem aplikacji zarządzanej. Nie można go włączyć dla aplikacji, które zostały już uruchomione.

W poniższej tabeli wymieniono MDAs (Managed Debugging Assistants) dostarczane wraz z platformą .NET Framework.

MDA
asynchroniczneZakończenieWątku
bindingFailure
callbackOnCollectedDelegate
blokada przełączania kontekstu
dangerousThreadingAPI
dateTimeInvalidLocalFormat
dirtyCastAndCallOnInterface
rozłączonyKontekst
dllMainReturnsFalse
exceptionSwallowedOnCallFromCom
nieudana kontrola jakości
fatalExecutionEngineError
gcManagedToUnmanaged
gcUnmanagedToManaged
illegalPrepareConstrainedRegion
nieprawidłowa zmiana stanu apartamentu
invalidCERCall
invalidFunctionPointerInDelegate
invalidGCHandleCookie
invalidIUnknown
nieprawidłowaDeklaracjaCzłonka
invalidOverlappedToPinvoke
nieprawidłowyWariant
jitCompilationStart
loaderLock
loadFromContext
marshalCleanupError
organizowanie
tworzenie pamięci podręcznej informacji o członkach
moduloObjectHashcode
nonComVisibleBaseClass
notMarshalable
openGenericCERCall
overlappedFreeError
pInvokeLog
pInvokeStackImbalance
raceOnRCWCleanup
Ponowne wejście
Nie udało się zwolnić uchwytu
reportAvOnComRelease
streamWriterUtrataBuforowanychDanych
virtualCERCall

Domyślnie program .NET Framework aktywizuje podzbiór MDA dla wszystkich zarządzanych debugerów. Domyślny zestaw można wyświetlić w programie Visual Studio, wybierając pozycjęUstawienia wyjątków systemu > w menu Debugowanie, a następnie rozwijając listę Zarządzanych Asystentów debugowania.

Okno Ustawienia wyjątku w programie Visual Studio

Włączanie i wyłączanie MDA

Można włączać i wyłączać usługi MDA przy użyciu klucza rejestru, zmiennej środowiskowej i ustawień konfiguracji aplikacji. Musisz włączyć klucz rejestru lub zmienną środowiskową, aby używać ustawień konfiguracji aplikacji.

Wskazówka

Zamiast wyłączać usługi MDA, można uniemożliwić programowi Visual Studio wyświetlanie okna dialogowego MDA za każdym razem, gdy zostanie odebrane powiadomienie MDA. W tym celu wybierz pozycję Windows>Ustawienia wyjątków w menu Debugowanie, rozwiń listę Zarządzanych asystentów debugowania, a następnie zaznacz lub wyczyść pole wyboru Przerwij przy wystąpieniu dla poszczególnych MDA.

Klucz rejestru

Aby włączyć usługi MDA, dodaj podklucz HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\MDA (wpisz REG_SZ, wartość 1) w rejestrze systemu Windows. Skopiuj poniższy przykład do pliku tekstowego o nazwie MDAEnable.reg. Otwórz Edytor rejestru systemu Windows (RegEdit.exe), a następnie z menu Plik wybierz pozycję Importuj. Wybierz plik MDAEnable.reg , aby włączyć usługi MDA na tym komputerze. Ustawienie podklucza na wartość ciągu 1 (a nie wartość DWORD 1) umożliwia odczytywanie ustawień MDA z pliku ApplicationName.sufiks.mda.config. Na przykład plik konfiguracji MDA dla Notatnika ma nazwę notepad.exe.mda.config.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"MDA"="1"

Jeśli na komputerze jest uruchomiona 32-bitowa aplikacja w 64-bitowym systemie operacyjnym, należy ustawić klucz MDA w następujący sposób:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework]
"MDA"="1"

Aby uzyskać więcej informacji, zobacz Application-Specific Configuration Settings (Ustawienia konfiguracjiApplication-Specific ). Ustawienie rejestru może zostać zastąpione przez zmienną środowiskową COMPLUS_MDA . Aby uzyskać więcej informacji, zobacz Zmienna środowiskowa .

Aby wyłączyć usługi MDA, ustaw podklucz MDA na 0 (zero) przy użyciu Edytora rejestru systemu Windows.

Domyślnie, niektóre MDAs są włączone przy uruchamianiu aplikacji powiązanej z debugerem, nawet bez dodawania klucza rejestru. Te asystenty można wyłączyć, uruchamiając plik MDADisable.reg zgodnie z opisem we wcześniejszej części tej sekcji.

zmienna środowiskowa

Aktywacja MDA może być również kontrolowana przez zmienną środowiskową COMPLUS_MDA, która zastępuje klucz rejestru. Ciąg COMPLUS_MDA jest nieczuły na wielkość liter i składa się z rozdzielanej średnikami listy nazw MDA lub innych specjalnych ciągów kontrolnych. Uruchamianie pod nadzorem zarządzanego lub niezarządzanego debuggera domyślnie włącza zestaw MDA. Odbywa się to przez niejawne dodanie na początku rozdzielanej średnikami listy MDAs, które są domyślnie włączone w debugerach, do wartości zmiennej środowiskowej lub klucza rejestru. Specjalne ciągi sterujące są następujące:

  • 0 - Dezaktywuje wszystkie mdA.

  • 1 - Odczytuje ustawienia MDA z applicationName.mda.config.

  • managedDebugger — jawnie aktywuje wszystkie MDA, które są niejawnie aktywowane przy uruchamianiu zarządzanego pliku wykonywalnego w debugerze.

  • unmanagedDebugger — Jawnie aktywuje wszystkie MDAs, które są niejawnie aktywowane w momencie uruchamiania niezarządzanego pliku wykonywalnego w debuggerze.

Jeśli występują konflikty ustawień, najnowsze ustawienia zastępują poprzednie ustawienia:

  • COMPLUS_MDA=0 Wyłącza wszystkie MDA, w tym te niejawnie włączone w debuggerze.

  • COMPLUS_MDA=gcUnmanagedToManaged gcUnmanagedToManaged umożliwia działanie oprócz tych MDAs, które są niejawnie włączone w debugerze.

  • COMPLUS_MDA=0;gcUnmanagedToManaged włącza gcUnmanagedToManaged, ale wyłącza MDA, które inaczej byłyby niejawnie włączone w debugerze.

Application-Specific Ustawienia Konfiguracji

Możesz włączyć, wyłączyć i skonfigurować niektórych asystentów indywidualnie w pliku konfiguracji MDA dla aplikacji. Aby włączyć używanie pliku konfiguracji aplikacji do konfigurowania umów MDA, należy ustawić klucz rejestru MDA lub zmienną COMPLUS_MDA środowiskową. Plik konfiguracji aplikacji znajduje się zwykle w tym samym katalogu co plik wykonywalny aplikacji (.exe). Nazwa pliku ma postać ApplicationName.mda.config; na przykład notepad.exe.mda.config. Asystentów, które są włączone w pliku konfiguracji aplikacji, mogą mieć atrybuty lub elementy przeznaczone do kontrolowania zachowania asystenta.

W poniższym przykładzie pokazano, jak włączyć i skonfigurować marshaling:

<mdaConfig>
  <assistants>
    <marshaling>
      <methodFilter>
        <match name="*"/>
      </methodFilter>
      <fieldFilter>
        <match name="*"/>
      </fieldFilter>
    </marshaling>
  </assistants>
</mdaConfig>

MDA Marshaling emituje informacje o typie zarządzanym, który jest przenoszony do typu niezarządzanego podczas każdego przejścia z zarządzanego do niezarządzanego w aplikacji. MdA Marshaling może również filtrować nazwy pól metody i struktury podanych odpowiednio w elementach podrzędnych methodFilter i fieldFilter .

W poniższym przykładzie pokazano, jak włączyć wiele MDA przy użyciu ich ustawień domyślnych:

<mdaConfig>
  <assistants>
    <illegalPrepareConstrainedRegion />
    <invalidCERCall />
    <openGenericCERCall />
    <virtualCERCall />
  </assistants>
</mdaConfig>

Ważne

Po określeniu więcej niż jednego asystenta w pliku konfiguracji należy je wyświetlić w kolejności alfabetycznej. Jeśli na przykład chcesz włączyć zarówno virtualCERCall, jak i invalidCERCall MDA, musisz dodać wpis <invalidCERCall /> przed wpisem <virtualCERCall />. Jeśli wpisy nie są w kolejności alfabetycznej, zostanie wyświetlony komunikat o nieobsługiwanym wyjątku nieprawidłowego pliku konfiguracji.

Wyjątki MDA

Po włączeniu usługi MDA jest ona aktywna nawet wtedy, gdy kod nie jest wykonywany w debugerze. Jeśli zdarzenie MDA jest zgłaszane, gdy debuger nie jest obecny, komunikat zdarzenia jest wyświetlany w nieobsługiwanym oknie dialogowym wyjątku, chociaż nie jest to nieobsługiwany wyjątek. Aby uniknąć okna dialogowego, usuń ustawienia włączania mdA, gdy kod nie jest wykonywany w środowisku debugowania.

Podczas wykonywania kodu w zintegrowanym środowisku programistycznym Visual Studio (IDE) można uniknąć wyświetlania okna dialogowego wyjątku dla określonych zdarzeń MDA. W tym celu w menu Debugowanie wybierz pozycjęUstawienia wyjątków systemu >. W oknie Ustawienia wyjątków rozwiń listę Asystentów debugowania zarządzanego, a następnie usuń zaznaczenie pola wyboru Przerwij podczas wyrzucenia dla poszczególnego MDA. Możesz również użyć tego okna dialogowego, aby włączyć wyświetlanie okien dialogowych wyjątków MDA.

Dane wyjściowe MDA

Dane wyjściowe usługi MDA są podobne do następującego przykładu, który pokazuje dane wyjściowe z usługi PInvokeStackImbalance MDA:

Wywołanie funkcji PInvoke 'MDATest!MDATest.Program::StdCall' spowodowało niezrównoważenie stosu. Jest to prawdopodobne, ponieważ sygnatura zarządzana PInvoke nie jest zgodna z niezarządzaną sygnaturą docelową. Sprawdź, czy konwencja wywoływania i parametry podpisu PInvoke są zgodne z docelowym niezarządzanym podpisem.

Zobacz także