Diagnostizieren von Fehlern mit Assistenten für verwaltetes Debuggen

Aktualisiert: Juli 2008

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.

asynchronousThreadAbort-MDA

bindingFailure-MDA

callbackOnCollectedDelegate-MDA

contextSwitchDeadlock-MDA

dangerousThreadingAPI-MDA

dateTimeInvalidLocalFormat-MDA

dirtyCastAndCallOnInterface-MDA

disconnectedContext-MDA

dllMainReturnsFalse-MDA

exceptionSwallowedOnCallFromCom-MDA

failedQI-MDA

fatalExecutionEngineError-MDA

gcManagedToUnmanaged-MDA

gcUnmanagedToManaged-MDA

illegalPrepareConstrainedRegion-MDA

invalidApartmentStateChange-MDA

invalidCERCall-MDA

invalidFunctionPointerInDelegate-MDA

invalidGCHandleCookie-MDA

invalidIUnknown-MDA

invalidMemberDeclaration-MDA

invalidOverlappedToPinvoke-MDA

invalidVariant-MDA

jitCompilationStart-MDA

loaderLock-MDA

loadFromContext-MDA

marshalCleanupError-MDA

marshaling-MDA

memberInfoCacheCreation-MDA

moduloObjectHashcode-MDA

nonComVisibleBaseClass-MDA

notMarshalable-MDA

openGenericCERCall-MDA

overlappedFreeError-MDA

pInvokeLog-MDA

pInvokeStackImbalance-MDA

raceOnRCWCleanup-MDA

Reentrancy

releaseHandleFailed-MDA

reportAvOnComRelease-MDA

streamWriterBufferedDataLost-MDA

virtualCERCall-MDA

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:

  1. Wählen Sie im Projektmappen-Explorer ein Projekt aus.

  2. Klicken Sie im Menü Projekt auf Eigenschaften.

    Das Fenster Projekt-Designer wird angezeigt.

  3. Klicken Sie auf die Registerkarte Debuggen.

  4. 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 mit einem Registrierungsschlüssel

Sie können MDAs bereitstellen, indem Sie der Windows-Registrierung den Unterschlüssel HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\MDA hinzufügen. Kopieren Sie das folgende Beispiel in eine Textdatei mit dem Namen "MDAEnable.reg":

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"MDA"="1"

Führen Sie die Datei MDAEnable.reg an der Eingabeaufforderung aus, um MDAs auf diesem Computer bereitzustellen. Um die Bereitstellung von MDAs aufzuheben, kopieren Sie das folgende Beispiel in eine Textdatei mit dem Namen "MDADisable.reg":

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"MDA"="0"

Führen Sie die Datei MDADisable.reg anschließend an der Eingabeaufforderung aus.

In der Standardeinstellung werden einige MDAs bereitgestellt, wenn die Anwendung bei der Ausführung an einen Debugger angehängt wird, selbst 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 oben beschrieben ausführen.

Bereitstellen und Aufheben der Bereitstellung mit einer Umgebungsvariablen

Sie können die Bereitstellung von MDAs auch mithilfe der Umgebungsvariablen COMPLUS_MDA steuern. Die Umgebungsvariable überschreibt den Registrierungsschlüssel. Die Zeichenfolge ist eine durch Semikolons getrennte Liste von MDA-Namen und anderen Steuerzeichenfolgen, bei 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 aktiviert gcUnmanagedToManaged zusätzlich zu denen, die implizit unter einem Debugger 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 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 weist die Form ApplicationName.mda.config auf, 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>

Diese Einstellungen stellen den Marshaling-MDA bereit und konfigurieren ihn. Dieser 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 besitzt außerdem die Flexibilität, den im untergeordneten <methodFilter>-Element angegebenen Namen der Methode sowie die im <fieldFilter>-Element angegebenen Namen der Strukturfelder zu filtern.

Weitere Informationen über die Einstellungen für die einzelnen MDAs finden Sie in der Dokumentation des jeweiligen MDAs.

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.

Siehe auch

Weitere Ressourcen

Debuggen und Profilerstellung von Anwendungen

Änderungsprotokoll

Date

Versionsgeschichte

Grund

Juli 2008

Hinweis zum Vermeiden der ContextSwitchDeadlock-Meldung hinzugefügt.

Kundenfeedback.