Diagnostizieren von Fehlern mit Assistenten für verwaltetes Debuggen
MDAs (Managed Debugging Assistants, Assistenten für verwaltetes Debuggen) sind Hilfsmittel für das Debuggen, die mit der CLR (Common Language Runtime) zusammenarbeiten, um Informationen zum Laufzeitzustand bereitzustellen. Die Assistenten generieren Informationsmeldungen über Laufzeitereignisse, die Sie auf keine andere Art abfangen können. Sie können MDAs verwenden, um schwer aufzufindende Anwendungsfehler zu isolieren, die bei Übergängen zwischen verwaltetem und nicht verwaltetem Code auftreten. Alle MDAs können durch Hinzufügen eines Schlüssels zur Windows-Registrierung oder durch Festlegen einer Umgebungsvariable bereitgestellt bzw. deren Bereitstellung aufgehoben werden. Sie können bestimmte MDAs mithilfe von Anwendungskonfigurationseinstellungen aktivieren. In der Konfigurationsdatei der Anwendung können Sie zusätzliche Konfigurationseinstellungen für einige der MDAs festlegen. Da die Konfigurationsdateien beim Laden der Laufzeit analysiert werden, müssen Sie den MDA bereitstellen, bevor die verwaltete Anwendung gestartet wird. Sie können ihn nicht für Anwendungen bereitstellen, die bereits gestartet wurden.
Hinweis |
---|
Wenn ein MDA aktiviert ist, ist er selbst dann aktiv, wenn der Code nicht unter einem Debugger ausgewführt wird.Wenn ein MDA-Ereignis ausgelöst wird, wenn kein Debugger vorhanden ist, wird die Ereignismeldung in einem Dialogfeld für unbehandelte Ausnahmen angezeigt, obwohl dies keine unbehandelte Ausnahme darstellt.Um das Anzeigen dieses Dialogfelds zu vermeiden, entfernen Sie die Einstellungen zur Aktivierung des MDA, wenn der Code nicht in einer Debugumgebung ausgeführt wird. |
Hinweis |
---|
Wenn Ihr Code in der integrierten Entwicklungsumgebung (IDE) von Visual Studio ausgeführt wird, können Sie das für bestimmte MDA-Ereignisse angezeigte Ausnahmedialogfeld umgehen.Klicken Sie dazu im Menü Debuggen auf Ausnahmen.(Wenn das Menü Debug den Befehl Ausnahmen nicht enthält, klicken Sie im Menü Tools auf Anpassen, um ihn hinzuzufügen.) Erweitern Sie im Dialogfeld Ausnahmen die Liste Assistenten für verwaltetes Debuggen, und deaktivieren Sie das Kontrollkästchen Ausgelöst für den jeweiligen MDA.Um beispielsweise das Ausnahmedialogfeld für einen contextSwitchDeadlock-MDA zu umgehen, deaktivieren Sie in der Liste Assistenten für verwaltetes Debuggen neben dem entsprechenden Namen das Kontrollkästchen Ausgelöst.Sie können dieses Dialogfeld auch verwenden, um MDAs zu aktivieren. |
In der folgenden Tabelle werden die MDAs im Lieferumfang von .NET Framework aufgeführt.
Standardmäßig aktiviert .NET Framework eine Teilmenge von MDAs für alle verwalteten Debugger. Sie können diese standardmäßige Teilmenge in Visual Studio anzeigen, indem Sie im Menü Debuggen auf Ausnahmen klicken und die Liste Assistenten für verwaltetes Debuggen erweitern.
Bereitstellen und Aufheben der Bereitstellung von MDAs
Sie können MDAs mit einem Registrierungsschlüssel, einer Umgebungsvariablen und Anwendungskonfigurationseinstellungen bereitstellen sowie deren Bereitstellung aufheben. Sie müssen entweder den Registrierungsschlüssel oder die Umgebungsvariable für die Verwendung der Anwendungskonfigurationseinstellungen aktivieren.
In Visual Studio ab Version 2005 können Sie, wenn der Hostprozess aktiviert ist, MDAs nicht deaktivieren, die sich in der standardmäßigen Teilmenge befinden, oder MDAs aktivieren, die sich nicht in der standardmäßigen Teilmenge befinden. Der Hostprozess wird standardmäßig aktiviert, sodass er explizit deaktiviert werden muss.
Gehen Sie wie folgt vor, um den Hostprozess in Visual Studio zu deaktivieren:
Wählen Sie im Projektmappen-Explorer ein Projekt aus.
Klicken Sie im Menü Projekt auf Eigenschaften.
Das Fenster Projekt-Designer wird angezeigt.
Klicken Sie auf die Registerkarte Debuggen.
Deaktivieren Sie im Abschnitt Debugger aktivieren das Kontrollkästchen Visual Studio-Hostprozess aktivieren.
Die Deaktivierung des Hostprozesses kann sich jedoch auf die Leistung auswirken. Sie können vermeiden, MDAs deaktivieren zu müssen, indem Sie Visual Studio so konfigurieren, dass das MDA-Dialogfeld nicht angezeigt wird, wenn eine MDA-Benachrichtigung empfangen wird. Klicken Sie hierzu im Menü Debuggen auf Ausnahmen, erweitern Sie die Liste Assistenten für verwaltetes Debuggen, und aktivieren bzw. deaktivieren Sie das Kontrollkästchen Ausgelöst für den jeweiligen MDA.
Bereitstellen und Aufheben der Bereitstellung von MDAs mit einem Registrierungsschlüssel
Sie können MDAs bereitstellen, indem Sie der Windows-Registrierung den Unterschlüssel "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\MDA" (Typ: REG_SZ, Wert: 1) hinzufügen. Kopieren Sie das folgende Beispiel in eine Textdatei mit dem Namen "MDAEnable.reg", und doppelklicken Sie im Windows-Explorer auf den Dateinamen, um auf diesem Computer MDAs zu aktivieren.
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"MDA"="1"
Um MDAs zu deaktivieren, legen Sie den MDA-Unterschlüssel mit dem Windows-Registrierungs-Editor auf 0 (null) fest. Alternativ dazu können Sie das folgende Beispiel in eine Textdatei mit dem Namen "MDADisable.reg" kopieren und im Windows-Explorer auf den Dateinamen doppelklicken.
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"MDA"="0"
In der Standardeinstellung werden einige MDAs bereitgestellt, wenn Sie eine Anwendung ausführen, die an einen Debugger angehängt ist. Dies gilt auch, wenn der Registrierungsschlüssel nicht hinzugefügt wurde. Hierbei handelt es sich z. B. um pInvokeStackImbalance-MDA und invalidApartmentStateChange-MDA. Sie können die Bereitstellung dieser Assistenten aufheben, indem Sie die Datei "MDADisable.reg" wie weiter oben in diesem Abschnitt beschrieben ausführen.
Bereitstellen und Aufheben der Bereitstellung von MDAs mit einer Umgebungsvariable
Sie können die Bereitstellung von MDAs auch mithilfe der Umgebungsvariablen COMPLUS_MDA steuern, die den Registrierungsschlüssel überschreibt. Die Zeichenfolge COMPLUS_MDA ist eine durch Semikolons getrennte Liste von MDA-Namen und anderen Steuerzeichenfolgen, in der die Groß- und Kleinschreibung nicht beachtet wird. Bei einem Start unter einem verwalteten oder nicht verwalteten Debugger wird standardmäßig ein Satz MDAs bereitgestellt. Dies wird erzielt, indem die durch Semikolons getrennte Liste der MDAs, die standardmäßig unter Debuggern bereitgestellt werden, dem Wert der Umgebungsvariablen oder des Registrierungsschlüssels vorangestellt wird. Folgende Steuerzeichenfolgen sind verfügbar:
0: Deaktiviert alle MDAs.
1: Liest MDA-Einstellungen aus ApplicationName.mda.config.
managedDebugger: Aktiviert ausdrücklich alle MDAs, die implizit aktiviert werden, wenn eine verwaltete ausführbare Datei unter einem Debugger gestartet wird.
unmanagedDebugger: Aktiviert ausdrücklich alle MDAs, die implizit aktiviert werden, wenn eine nicht verwaltete ausführbare Datei unter einem Debugger gestartet wird.
Wenn widersprüchliche Einstellungen vorhanden sind, überschreiben die neueren Einstellungen die älteren Einstellungen:
COMPLUS_MDA=0: Deaktiviert alle MDAs einschließlich der MDAs, die implizit unter einem Debugger aktiviert werden.
COMPLUS_MDA=gcUnmanagedToManaged stellt gcUnmanagedToManaged zusätzlich zu allen MDAs bereit, die unter einem Debugger implizit aktiviert werden.
COMPLUS_MDA=0;gcUnmanagedToManaged aktiviert gcUnmanagedToManaged, aber deaktiviert die MDAs, die andernfalls implizit unter einem Debugger aktiviert werden.
Bereitstellen und Aufheben der Bereitstellung von MDAs mit anwendungsspezifischen Konfigurationseinstellungen
In der MDA-Konfigurationsdatei für die Anwendung können Sie einige MDAs einzeln bereitstellen und konfigurieren bzw. deren Bereitstellung aufheben. Damit MDAs mithilfe einer Anwendungskonfigurationsdatei konfiguriert werden können, muss entweder der MDA-Registrierungsschlüssel oder die COMPLUS_MDA-Umgebungsvariable festgelegt sein. Die Anwendungskonfigurationsdatei befindet sich i. d. R. im selben Verzeichnis wie die ausführbare Datei (.exe) der Anwendung. Der Dateiname hat das Format "Anwendungsname.mda.config", z. B. "notepad.exe.mda.config". Assistenten, die über die Anwendungskonfigurationsdatei bereitgestellt werden, können Attribute oder Elemente aufweisen, die speziell für die Steuerung des Verhaltens dieses Assistenten vorgesehen sind. Im folgenden Beispiel wird veranschaulicht, wie der marshaling-MDA bereitgestellt und konfiguriert wird.
<mdaConfig>
<assistants>
<marshaling>
<methodFilter>
<match name="*"/>
</methodFilter>
<fieldFilter>
<match name="*"/>
</fieldFilter>
</marshaling>
</assistants>
</mdaConfig>
Der Marshaling-MDA gibt für jeden Übergang von verwaltetem zu nicht verwaltetem Code in der Anwendung Informationen darüber aus, welcher verwaltete Typ an einen nicht verwalteten Typ gemarshallt wird. Der Marshaling-MDA kann außerdem die Namen der Methoden- und Strukturfelder filtern, die in den untergeordneten Elementen <methodFilter> bzw. <fieldFilter> angegeben sind.
Das folgende Beispiel veranschaulicht, wie Sie mehrere MDAs mithilfe ihrer Standardeinstellungen bereitstellen.
<mdaConfig>
<assistants>
<illegalPrepareConstrainedRegion />
<invalidCERCall />
<openGenericCERCall />
<virtualCERCall />
</assistants>
</mdaConfig>
Wichtig |
---|
Wenn Sie in einer Konfigurationsdatei mehr als einen Assistenten angeben, müssen Sie diese in alphabetischer Reihenfolge aufführen.Wenn Sie z. B. sowohl den virtualCERCall-MDA als auch den invalidCERCall-MDA bereitstellen möchten, müssen Sie den <invalidCERCall />-Eintrag vor dem <virtualCERCall />-Eintrag hinzufügen.Falls die Einträge nicht in alphabetischer Reihenfolge aufgeführt sind, wird eine Meldung mit einer unbehandelten Ausnahme zu einer ungültigen Konfigurationsdatei angezeigt. |
MDA-Ausgabe
Die Ausgaben der MDAs ähneln dem folgenden Beispiel, in dem die Ausgabe des pInvokeStackImbalance-MDAs veranschaulicht wird.
A call to PInvoke function 'MDATest!MDATest.Program::StdCall' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.