Udostępnij za pośrednictwem


Diagnozowanie błędów przy użyciu asystentów zarządzanego debugowania

Uwaga

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 urzędy mdA, 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 umowy MDA dostarczane za pomocą programu .NET Framework:

MDA
asynchronousThreadAbort
bindingFailure
callbackOnCollectedDelegate
contextSwitchDeadlock
dangerousThreadingAPI
dateTimeInvalidLocalFormat
dirtyCastAndCallOnInterface
disconnectedContext
dllMainReturnsFalse
exceptionSwallowedOnCallFromCom
failedQI
fatalExecutionEngineError
gcManagedToUnmanaged
gcUnmanagedToManaged
illegalPrepareConstrainedRegion
invalidApartmentStateChange
invalidCERCall
invalidFunctionPointerInDelegate
invalidGCHandleCookie
invalidIUnknown
invalidMemberDeclaration
invalidOverlappedToPinvoke
invalidVariant
jitCompilationStart
loaderLock
loadFromContext
marshalCleanupError
marshaling
memberInfoCacheCreation
moduloObjectHashcode
nonComVisibleBaseClass
notMarshalable
openGenericCERCall
overlappedFreeError
pInvokeLog
pInvokeStackImbalance
raceOnRCWCleanup
reentrancy
releaseHandleFailed
reportAvOnComRelease
streamWriterBufferedDataLost
virtualCERCall

Domyślnie program .NET Framework aktywuje 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 Windows>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 umów 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.

Napiwek

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ę Ustawienia wyjątków systemu Windows>w menu Debugowanie, rozwiń listę Zarządzanych asystentów debugowania, a następnie zaznacz lub wyczyść pole wyboru Przerwij po wrzuceniudla poszczególnych mdA.

Klucz rejestru

Aby włączyć usługi MDA, dodaj HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\. Podklucz 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 Ustawienia konfiguracji specyficzne dla aplikacji. 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 urzędy mdA są włączone podczas uruchamiania aplikacji dołączonej do debugera, nawet bez dodawania klucza rejestru. Te asystenty można wyłączyć, uruchamiając plik MDADisable.reg zgodnie z wcześniejszym opisem w 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 to bez uwzględniania COMPLUS_MDA wielkości liter, rozdzielana średnikami lista nazw MDA lub innych specjalnych ciągów kontrolnych. Uruchamianie w ramach zarządzanego lub niezarządzanego debugera domyślnie włącza zestaw mdA. Odbywa się to przez niejawne poprzedzanie rozdzielanej średnikami listy mdA, 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 pliku ApplicationName.mda.config.

  • managedDebugger — Jawnie aktywuje wszystkie mdA, które są niejawnie aktywowane po uruchomieniu zarządzanego pliku wykonywalnego w debugerze.

  • unmanagedDebugger — Jawnie aktywuje wszystkie mdA, które są niejawnie aktywowane po uruchomieniu niezarządzanego pliku wykonywalnego w debugerze.

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 debugerze.

  • COMPLUS_MDA=gcUnmanagedToManagedgcUnmanagedToManaged umożliwia oprócz wszystkich mdA, które są niejawnie włączone w debugerze.

  • COMPLUS_MDA=0;gcUnmanagedToManagedgcUnmanagedToManaged włącza, ale wyłącza mdA, które w przeciwnym razie byłyby niejawnie włączone w debugerze.

Ustawienia konfiguracji specyficzne dla aplikacji

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ę zazwyczaj 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 dla każdego zarządzanego przejścia 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 umów MDA przy użyciu 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 te, jak virtualCERCall i invalidCERCall MDA, musisz dodać <invalidCERCall /> wpis przed wpisem <virtualCERCall /> . Jeśli wpisy nie są w kolejności alfabetycznej, zostanie wyświetlony nieobsługiwany nieprawidłowy komunikat o wyjątku 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.

Po wykonaniu kodu w zintegrowanym środowisku projektowym programu Visual Studio (IDE) można uniknąć okna dialogowego wyjątku wyświetlanego dla określonych zdarzeń MDA. W tym celu w menu Debugowanie wybierz pozycję Ustawienia wyjątków systemu Windows>. W oknie Ustawienia wyjątków rozwiń listę Asystentów debugowania zarządzanego, a następnie wyczyść pole wyboru Przerwij po wyrzuceniu dla pojedynczej usługi 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! Plik MDATest.Program::StdCall' nie zrównoważył stosu. Jest to prawdopodobne, ponieważ zarządzany podpis PInvoke nie jest zgodny z niezarządzaną sygnaturą docelową. Sprawdź, czy konwencja wywoływania i parametry podpisu PInvoke są zgodne z docelowym podpisem niezarządzanych.

Zobacz też