Diagnostizieren von Fehlern mit Assistenten für verwaltetes DebuggenDiagnosing Errors with Managed Debugging Assistants

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.Managed debugging assistants (MDAs) are debugging aids that work in conjunction with the common language runtime (CLR) to provide information on runtime state. Die Assistenten generieren Informationsmeldungen über Laufzeitereignisse, die Sie auf keine andere Art abfangen können.The assistants generate informational messages about runtime events that you cannot otherwise trap. Sie können MDAs verwenden, um schwer aufzufindende Anwendungsfehler zu isolieren, die bei Übergängen zwischen verwaltetem und nicht verwaltetem Code auftreten.You can use MDAs to isolate hard-to-find application bugs that occur when transitioning between managed and unmanaged code. Alle MDAs können durch Hinzufügen eines Schlüssels zur Windows-Registrierung oder durch Festlegen einer Umgebungsvariable bereitgestellt bzw. deren Bereitstellung aufgehoben werden.You can enable or disable all MDAs by adding a key to the Windows registry or by setting an environment variable. Sie können bestimmte MDAs mithilfe von Anwendungskonfigurationseinstellungen aktivieren.You can enable specific MDAs by using application configuration settings. In der Konfigurationsdatei der Anwendung können Sie zusätzliche Konfigurationseinstellungen für einige der MDAs festlegen.You can set additional configuration settings for some individual MDAs in the application's configuration file. Da die Konfigurationsdateien beim Laden der Laufzeit analysiert werden, müssen Sie den MDA bereitstellen, bevor die verwaltete Anwendung gestartet wird.Because these configuration files are parsed when the runtime is loaded, you must enable the MDA before the managed application starts. Sie können ihn nicht für Anwendungen bereitstellen, die bereits gestartet wurden.You cannot enable it for applications that have already started.

Hinweis

Wenn ein MDA aktiviert ist, ist er selbst dann aktiv, wenn der Code nicht unter einem Debugger ausgewführt wird.When an MDA is enabled, it is active even when your code is not executing under a debugger. 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.If an MDA event is raised when a debugger is not present, the event message is presented in an unhandled exception dialog box, although it is not an unhandled exception. 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.To avoid the dialog box, remove the MDA-enabling settings when your code is not executing in a debugging environment.

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.When your code is executing in the Visual Studio integrated development environment (IDE), you can avoid the exception dialog box that appears for specific MDA events. Klicken Sie dazu im Menü Debuggen auf Ausnahmen.To do that, on the Debug menu, click Exceptions. (Wenn das Menü Debuggen den Befehl Ausnahmen nicht enthält, klicken Sie im Menü Extras auf Anpassen, um ihn hinzuzufügen.) Erweitern Sie im Dialogfeld Ausnahmen die Liste Managed Debugging Assistants (Assistenten für verwaltetes Debuggen), und deaktivieren Sie das Kontrollkästchen Ausgelöst für den jeweiligen MDA.(If the Debug menu does not contain an Exceptions command, click Customize on the Tools menu to add it.) In the Exceptions dialog box, expand the Managed Debugging Assistants list, and then clear the Thrown check box for the individual MDA. Um beispielsweise das Ausnahmedialogfeld für contextSwitchDeadlock zu umgehen, deaktivieren Sie in der Liste Managed Debugging Assistants neben dem entsprechenden Namen das Kontrollkästchen Ausgelöst.For example, to avoid the exception dialog box for a contextSwitchDeadlock clear the Thrown check box next to its name in the Managed Debugging Assistants list. Sie können dieses Dialogfeld auch verwenden, um die Anzeige von MDA-Ausnahmedialogfeldern zu aktivieren.You can also use this dialog box to enable the display of MDA exception dialog boxes.

In der folgenden Tabelle werden die MDAs im Lieferumfang von .NET Framework aufgeführt.The following table lists the MDAs that ship with the .NET Framework.

asynchronousThreadAbortasynchronousThreadAbort bindingFailurebindingFailure
callbackOnCollectedDelegatecallbackOnCollectedDelegate contextSwitchDeadlockcontextSwitchDeadlock
dangerousThreadingAPIdangerousThreadingAPI dateTimeInvalidLocalFormatdateTimeInvalidLocalFormat
dirtyCastAndCallOnInterfacedirtyCastAndCallOnInterface disconnectedContextdisconnectedContext
dllMainReturnsFalsedllMainReturnsFalse exceptionSwallowedOnCallFromComexceptionSwallowedOnCallFromCom
failedQIfailedQI fatalExecutionEngineErrorfatalExecutionEngineError
gcManagedToUnmanagedgcManagedToUnmanaged gcUnmanagedToManagedgcUnmanagedToManaged
illegalPrepareConstrainedRegionillegalPrepareConstrainedRegion invalidApartmentStateChangeinvalidApartmentStateChange
invalidCERCallinvalidCERCall invalidFunctionPointerInDelegateinvalidFunctionPointerInDelegate
invalidGCHandleCookieinvalidGCHandleCookie invalidIUnknowninvalidIUnknown
invalidMemberDeclarationinvalidMemberDeclaration invalidOverlappedToPinvokeinvalidOverlappedToPinvoke
invalidVariantinvalidVariant jitCompilationStartjitCompilationStart
loaderLockloaderLock loadFromContextloadFromContext
marshalCleanupErrormarshalCleanupError marshalingmarshaling
memberInfoCacheCreationmemberInfoCacheCreation moduloObjectHashcodemoduloObjectHashcode
nonComVisibleBaseClassnonComVisibleBaseClass notMarshalablenotMarshalable
openGenericCERCallopenGenericCERCall overlappedFreeErroroverlappedFreeError
pInvokeLogpInvokeLog pInvokeStackImbalancepInvokeStackImbalance
raceOnRCWCleanupraceOnRCWCleanup reentrancyreentrancy
releaseHandleFailedreleaseHandleFailed reportAvOnComReleasereportAvOnComRelease
streamWriterBufferedDataLoststreamWriterBufferedDataLost virtualCERCallvirtualCERCall

Standardmäßig aktiviert .NET Framework eine Teilmenge von MDAs für alle verwalteten Debugger.By default, the .NET Framework activates a subset of MDAs for all managed debuggers. Sie können den Standardsatz in Visual Studio anzeigen, indem Sie im Menü Debuggen auf Ausnahmen klicken und die Liste Managed Debugging Assistants erweitern.You can view the default set in Visual Studio by clicking Exceptions on the Debug menu and expanding the Managed Debugging Assistants list.

Bereitstellen und Aufheben der Bereitstellung von MDAsEnabling and Disabling MDAs

Sie können MDAs mit einem Registrierungsschlüssel, einer Umgebungsvariablen und Anwendungskonfigurationseinstellungen bereitstellen sowie deren Bereitstellung aufheben.You can enable and disable MDAs by using a registry key, an environment variable, and application configuration settings. Sie müssen entweder den Registrierungsschlüssel oder die Umgebungsvariable für die Verwendung der Anwendungskonfigurationseinstellungen aktivieren.You must enable either the registry key or the environment variable to use the application configuration settings.

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.In Visual Studio 2005 and later versions, when the hosting process is enabled, you cannot disable MDAs that are in the default set or enable MDAs that are not in the default set. Der Hostprozess wird standardmäßig aktiviert, sodass er explizit deaktiviert werden muss.The hosting process is enabled by default, so it must be explicitly disabled.

Gehen Sie wie folgt vor, um den Hostprozess in Visual Studio zu deaktivieren:To disable the hosting process in Visual Studio, do the following:

  1. Wählen Sie im Projektmappen-Explorer ein Projekt aus.In Solution Explorer, select a project.

  2. Klicken Sie im Menü Projekt auf Eigenschaften.On the Project menu, click Properties.

    Das Fenster Projekt-Designer wird angezeigt.The Project Designer window appears.

  3. Klicken Sie auf die Registerkarte Debuggen.Click the Debug tab.

  4. Deaktivieren Sie im Abschnitt Debugger aktivieren das Kontrollkästchen Visual Studio-Hostprozess aktivieren.In the Enable Debuggers section, clear the Enable the Visual Studio hosting process check box.

Die Deaktivierung des Hostprozesses kann sich jedoch auf die Leistung auswirken.However, disabling the hosting process can affect performance. 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.You can avoid the need to disable MDAs by preventing Visual Studio from displaying the MDA dialog box whenever an MDA notification is received. Klicken Sie hierzu im Menü Debuggen auf Ausnahmen, erweitern Sie die Liste Managed Debugging Assistants, und aktivieren bzw. deaktivieren Sie das Kontrollkästchen Ausgelöst für den jeweiligen MDA.To do that, click Exceptions on the Debug menu, expand the Managed Debugging Assistants list, and then select or clear the Thrown check box for the individual MDA.

Bereitstellen und Aufheben der Bereitstellung von MDAs mit einem RegistrierungsschlüsselEnabling and Disabling MDAs by Using a Registry Key

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.You can enable MDAs by adding the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\MDA subkey (type REG_SZ, value 1) in the Windows registry. Kopieren Sie das folgende Beispiel in eine Textdatei mit dem Namen „MDAEnable.reg“. Öffnen Sie den Windows-Registrierungs-Editor (RegEdit.exe), und wählen Sie aus dem Menü Datei den Eintrag Importieren aus.Copy the following example into a text file named MDAEnable.reg. Open the Windows Registry Editor (RegEdit.exe) and from the File menu choose Import. Wählen Sie die Datei MDAEnable.reg, um auf diesem Computer MDAs zu aktivieren.Select the MDAEnable.reg file to enable MDAs on that computer. Durch Festlegen des Unterschlüssels auf den Zeichenfolgenwert 1 (nicht den DWORD-Wert 1) wird das Lesen der MDA-Einstellungen aus der Datei ApplicationName.suffix.mda.config aktiviert.Setting the subkey to string value of 1 (not DWORD value of 1) enables the reading of MDA settings from the ApplicationName.suffix.mda.config file. (Die MDA-Konfigurationsdatei für Notepad hätte z. B. den Namen notepad.exe.mda.config)(For example the MDA configuration file for Notepad would be named notepad.exe.mda.config)

Windows Registry Editor Version 5.00  

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

Führt der Computer eine 32-Bit-Anwendung auf einem 64-Bit-System aus, dann sollte der MDA-Schlüssel folgendermaßen festgelegt sein:If the computer is running a 32-bit application on a 64-bit operating system, then the MDA key should be set like the following:

      Windows Registry Editor Version 5.00   

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

Weitere Informationen finden Sie unter Bereitstellen und Aufheben der Bereitstellung von MDAs mit anwendungsspezifischen Konfigurationseinstellungen.See Enabling and Disabling MDAs by Using Application-Specific Configuration Settings for more information. Die Registrierungseinstellung kann durch die COMPLUS_MDA-Umgebungsvariable überschrieben werden.The registry setting can be overridden by the COMPLUS_MDA environment variable. Weitere Informationen finden Sie unter Bereitstellen und Aufheben der Bereitstellung von MDAs mit einer Umgebungsvariable.See Enabling and Disabling MDAs by Using an Environment Variable for more information.

Um MDAs zu deaktivieren, legen Sie den MDA-Unterschlüssel mit dem Windows-Registrierungs-Editor auf 0 (null) fest.To disable MDAs, set the MDA subkey to 0 (zero) using the Windows Registry Editor.

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.By default, some MDAs are enabled when you run an application that is attached to a debugger, even without adding the registry key. Beispiele für solche Assistenten sind pInvokeStackImbalance und invalidApartmentStateChange.Examples of such assistants are pInvokeStackImbalance and invalidApartmentStateChange. Sie können die Bereitstellung dieser Assistenten aufheben, indem Sie die Datei "MDADisable.reg" wie weiter oben in diesem Abschnitt beschrieben ausführen.You can disable these assistants by running the MDADisable.reg file as described earlier in this section.

Bereitstellen und Aufheben der Bereitstellung von MDAs mit einer UmgebungsvariableEnabling and Disabling MDAs by Using an Environment Variable

Sie können die Bereitstellung von MDAs auch mithilfe der Umgebungsvariablen COMPLUS_MDA steuern, die den Registrierungsschlüssel überschreibt.MDA activation can also controlled by the environment variable COMPLUS_MDA, which overrides the registry key. 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.The COMPLUS_MDA string is a case-insensitive, semicolon-delimited list of MDA names or other special control strings. Bei einem Start unter einem verwalteten oder nicht verwalteten Debugger wird standardmäßig ein Satz MDAs bereitgestellt.Starting under a managed or unmanaged debugger enables a set of MDAs by default. 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.This is done by implicitly prepending the semicolon-delimited list of MDAs enabled by default under debuggers to the value of the environment variable or registry key. Folgende Steuerzeichenfolgen sind verfügbar:The special control strings are the following:

  • 0: Deaktiviert alle MDAs.0 - Deactivates all MDAs.

  • 1: Liest MDA-Einstellungen aus ApplicationName.mda.config.1 - Reads MDA settings from ApplicationName.mda.config.

  • managedDebugger: Aktiviert ausdrücklich alle MDAs, die implizit aktiviert werden, wenn eine verwaltete ausführbare Datei unter einem Debugger gestartet wird.managedDebugger - Explicitly activates all MDAs that are implicitly activated when a managed executable is started under a debugger.

  • unmanagedDebugger: Aktiviert ausdrücklich alle MDAs, die implizit aktiviert werden, wenn eine nicht verwaltete ausführbare Datei unter einem Debugger gestartet wird.unmanagedDebugger - Explicitly activates all MDAs that are implicitly activated when an unmanaged executable is started under a debugger.

Wenn widersprüchliche Einstellungen vorhanden sind, überschreiben die neueren Einstellungen die älteren Einstellungen:If there are conflicting settings, the most recent settings override previous settings:

  • COMPLUS_MDA=0: Deaktiviert alle MDAs einschließlich der MDAs, die implizit unter einem Debugger aktiviert werden.COMPLUS_MDA=0 disables all MDAs, including those implicitly enabled under a debugger.

  • COMPLUS_MDA=gcUnmanagedToManaged stellt gcUnmanagedToManaged zusätzlich zu allen MDAs bereit, die unter einem Debugger implizit aktiviert werden.COMPLUS_MDA=gcUnmanagedToManaged enables gcUnmanagedToManaged in addition to any MDAs that are implicitly enabled under a debugger.

  • COMPLUS_MDA=0;gcUnmanagedToManaged aktiviert gcUnmanagedToManaged, aber deaktiviert die MDAs, die andernfalls implizit unter einem Debugger aktiviert werden.COMPLUS_MDA=0;gcUnmanagedToManaged enables gcUnmanagedToManaged but disables MDAs that would otherwise be implicitly enabled under a debugger.

Bereitstellen und Aufheben der Bereitstellung von MDAs mit anwendungsspezifischen KonfigurationseinstellungenEnabling and Disabling MDAs by Using Application-Specific Configuration Settings

In der MDA-Konfigurationsdatei für die Anwendung können Sie einige MDAs einzeln bereitstellen und konfigurieren bzw. deren Bereitstellung aufheben.You can enable, disable, and configure some assistants individually in the MDA configuration file for the application. Damit MDAs mithilfe einer Anwendungskonfigurationsdatei konfiguriert werden können, muss entweder der MDA-Registrierungsschlüssel oder die COMPLUS_MDA-Umgebungsvariable festgelegt sein.To enable the use of an application configuration file for configuring MDAs, either the MDA registry key or the COMPLUS_MDA environment variable must be set. Die Anwendungskonfigurationsdatei befindet sich i. d. R. im selben Verzeichnis wie die ausführbare Datei (.exe) der Anwendung.The application configuration file is typically located in the same directory as the application's executable (.exe) file. Der Dateiname hat das Format ApplicationName.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.The file name takes the form ApplicationName.mda.config; for example, notepad.exe.mda.config. Assistants that are enabled in the application configuration file may have attributes or elements specifically designed to control that assistant's behavior. Im folgenden Beispiel wird veranschaulicht, wie marshaling bereitgestellt und konfiguriert wird.The following example shows how to enable and configure the marshaling.

<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.The Marshaling MDA emits information about the managed type that is being marshaled to an unmanaged type for each managed-to-unmanaged transition in the application. Der Marshaling-MDA kann außerdem die Namen der Methoden- und Strukturfelder filtern, die in den untergeordneten Elementen <methodFilter> bzw. <fieldFilter> angegeben sind.The Marshaling MDA can also filter the names of the method and structure fields supplied in the <methodFilter> and <fieldFilter> child elements, respectively.

Das folgende Beispiel veranschaulicht, wie Sie mehrere MDAs mithilfe ihrer Standardeinstellungen bereitstellen.The following example shows how to enable multiple MDAs by using their default settings.

<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.When you specify more than one assistant in a configuration file, you must list them in alphabetical order. 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.For example, if you want to enable both the virtualCERCall and the invalidCERCall MDAs, you must add the <invalidCERCall /> entry before the <virtualCERCall /> entry. Falls die Einträge nicht in alphabetischer Reihenfolge aufgeführt sind, wird eine Meldung mit einer unbehandelten Ausnahme zu einer ungültigen Konfigurationsdatei angezeigt.If the entries are not in alphabetical order, an unhandled invalid configuration file exception message is displayed.

MDA-AusgabeMDA Output

Die Ausgaben der MDAs ähneln dem folgenden Beispiel, in dem die Ausgabe des pInvokeStackImbalance-MDAs veranschaulicht wird.MDA output is similar to the following example, which shows the output from the pInvokeStackImbalance MDA.

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 auchSee Also

Debuggen, Ablaufverfolgung und ProfilerstellungDebugging, Tracing, and Profiling