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:
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.
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=gcUnmanagedToManaged
gcUnmanagedToManaged
umożliwia oprócz wszystkich mdA, które są niejawnie włączone w debugerze.COMPLUS_MDA=0;gcUnmanagedToManaged
gcUnmanagedToManaged
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.