Share via


MDbg.exe (.NET Framework-Befehlszeilendebugger)

Aktualisiert: April 2011

Der .NET Framework-Befehlszeilendebugger unterstützt Anbieter von Tools und Anwendungsentwickler beim Suchen und Beheben von Fehlern in Programmen, die für die Common Language Runtime von .NET Framework entwickelt wurden. Dieses Tool stellt mithilfe der Laufzeit-Debug-API Debugdienste bereit. Sie können mit MDbg.exe lediglich verwalteten Code debuggen. Das Debuggen von nicht verwaltetem Code wird nicht unterstützt.

Dieses Tool wird automatisch mit Visual Studio und mit dem Windows SDK installiert. Um das Tool auszuführen, empfiehlt es sich, dass Sie die Visual Studio-Eingabeaufforderung oder Windows SDK-Eingabeaufforderung (CMD-Shell) verwenden. Mit diesen Hilfsprogrammen können Sie das Tool problemlos ausführen, ohne in den Installationsordner zu navigieren. Weitere Informationen finden Sie unter Visual Studio- und Windows SDK-Eingabeaufforderungen.

  • Wenn Visual Studio auf dem Computer installiert ist: Klicken Sie auf der Taskleiste auf Start, All Programs, Visual Studio und Visual Studio Tools, und klicken Sie dann auf Visual Studio Command Prompt.

    – oder –

    Wenn das Windows SDK auf Ihrem Computer installiert ist: Klicken Sie auf der Taskleiste auf Start, All Programs, klicken Sie auf den Ordner für das Windows SDK, und klicken anschließend auf Command Prompt (oder CMD Shell).

  • Geben Sie an der Eingabeaufforderung Folgendes ein:

MDbg [ProgramName[arguments]] [options]

Befehle

Geben Sie im Debugger (entsprechend der Angabe in der mdbg>-Eingabeaufforderung) einen der Befehle im folgenden Abschnitt ein:

command [Argumente]

Bei Befehlen für MDbg.exe wird die Groß- und Kleinschreibung berücksichtigt.

Befehl

Beschreibungen

ap[rocess] [Zahl]

Wechselt zu einem anderen gedebuggten Prozess oder druckt verfügbare Prozesse. Die Zahlen sind keine echten Prozess-IDs (PID), sondern eine 0-indizierte Liste.

a[ttach] [pid]

Anfügen an einen Prozess oder drucken verfügbarer Prozesse.

b[reak] [ClassName.Method | FileName:LineNo]

Legt einen Haltepunkt bei der angegebenen Methode fest. Module werden nacheinander überprüft.

  • break FileName:LineNo legt einen Haltepunkt an einer Position in der Quelle fest.

  • break ~number legt einen Haltepunkt für ein Symbol fest, das vor kurzem mit dem x-Befehl angezeigt wurde.

  • break module!ClassName.Method+IlOffset legt einen Haltepunkt für den vollqualifizierten Speicherort fest.

block[ingObjects]

Zeigt Monitorsperren an, die blockierende Threads sind.

ca[tch] [Ausnahmetyp]

Bewirkt, dass der Debugger nicht nur bei den nicht behandelten Ausnahmen, sondern bei allen Ausnahmen unterbricht.

cl[earException]

Markiert die aktuelle Ausnahme als behandelt, sodass die Ausführung fortgesetzt werden kann. Wenn die Ursache der Ausnahme nicht behandelt wurde, kann die Ausnahme erneut schnell ausgelöst werden.

conf[ig] [Optionswert]

Zeigt alle konfigurierbaren Optionen an und wie die Optionen ohne optionale Werte aufgerufen werden. Bei Angabe der Option wird value als aktuelle Option festgelegt. Die folgenden Optionen sind derzeit verfügbar:

  • extpath legt den Pfad fest, um Erweiterungen zu suchen, wenn der load-Befehl verwendet wird.

  • extpath+ fügt einen Pfad zum Laden von Erweiterungen hinzu.

del[ete]

Löscht einen Haltepunkt.

de[tach]

Trennt einen gedebuggten Prozess.

d[own] [Frames]

Verschiebt den aktiven Stapelrahmen nach unten.

echo

Gibt eine Meldung in der Konsole wieder.

enableNotif[ication] typeName 0|1

Aktiviert (1) oder deaktiviert (0) benutzerdefinierte Benachrichtigungen für den angegebenen Typ.

ex[it] [Beendigungscode]

Beendet die Shell MDbg.exe und gibt optional den Exitcode des Prozesses an.

fo[reach] [AndererBefehl]

Führt einen Befehl für alle Threads aus. OtherCommand ist ein gültiger Befehl, der für einen Thread ausgeführt wird. foreach OtherCommand führt denselben Befehl für alle Threads aus.

f[unceval] [-ad Num] Funktionsname [args ... ]

Führt eine Funktionsauswertung für den derzeit aktiven Thread aus, wobei functionName die auszuwertende Funktion ist. Der Funktionsname muss vollqualifiziert sein, einschließlich Namespaces.

Die -ad-Option gibt die Anwendungsdomäne an, die zum Auflösen der Funktion verwendet werden soll. Wird die -ad-Option nicht angegeben, ist die Standardeinstellung der Anwendungsdomäne für die Auflösung die Anwendungsdomäne, in der sich der für die Funktionsauswertung verwendete Thread befindet.

Wenn die ausgewertete Funktion nicht statisch ist, sollte der erste übergebene Parameter ein this-Zeiger sein. Alle Anwendungsdomänen werden nach Argumenten für die Funktionsauswertung durchsucht.

Um einen Wert aus einer Anwendungsdomäne anzufordern, stellen Sie der Variablen die Modul- und Anwendungsdomänennamen als Präfix voran, z. B. funceval -ad 0 System.Object.ToString hello.exe#0!MyClass.g_rootRef. Mit diesem Befehl wird die Funktion System.Object.ToString in der Anwendungsdomäne 0 ausgewertet. Da die ToString-Methode eine Instanzfunktion ist, muss der erste Parameter ein this-Zeiger sein.

g[o]

Bewirkt, dass das Programm fortgesetzt wird, bis ein Haltepunkt erreicht wird, das Programm beendet wird oder ein Ereignis das Beenden des Programms verursacht (z. B. eine nicht behandelte Ausnahme).

h[elp] [Befehl]

– oder –

? [Befehl]

Zeigt eine Beschreibung aller Befehle oder eine ausführliche Beschreibung eines angegebenen Befehls an.

ig[nore] [Ereignis]

Bewirkt, dass der Debugger nur bei nicht behandelten Ausnahmen anhält.

int[ercept] Framenummer

Führt einen Rollback für den Debugger zu einer angegebenen Framenummer aus.

Wenn der Debugger auf eine Ausnahme trifft, verwenden Sie diesen Befehl, um für den Debugger einen Rollback zur angegebenen Framenummer auszuführen. Sie können den Programmzustand mit dem set-Befehl ändern und mit dem go-Befehl fortfahren.

k[ill]

Hält den aktiven Prozess an.

l[ist] [modules | appdomains | Assemblys

Zeigt die geladenen Module, Anwendungsdomänen oder Assemblys an.

lo[ad] Assemblyname

Lädt eine Erweiterung auf folgende Weise: Die angegebene Assembly wird geladen und dann wird versucht, die statische Methode LoadExtension vom Typ Microsoft.Tools.Mdbg.Extension.Extension auszuführen.

log [eventType]

Legt die zu protokollierenden Ereignisse oder zeigt diese an.

mo[de] [Option ein/aus]

Legt andere Debuggeroptionen fest. Verwenden Sie mode ohne Optionen, um eine Liste der Debugmodi und ihre aktuellen Einstellungen abzurufen.

mon[itorInfo] monitorReference

Zeigt Informationen zu Objektbildschirmsperren an.

newo[bj] Typname [arguments...]

Erstellt ein neues Objekt vom Typ typeName.

n[ext]

Führt Code aus und wechselt in die nächste Zeile (auch wenn die nächste Zeile viele Funktionsaufrufe enthält).

Opendump pathToDumpFile

Öffnet die angegebene Dumpdatei zum Debuggen.

o[ut]

Wechselt zum Ende der aktuellen Funktion.

pa[th] [Pfadname]

Durchsucht den angegebenen Pfad nach den Quelldateien, wenn die Position in den Binärdateien nicht verfügbar ist.

p[rint] [var] | [-d]

Druckt alle Variablen im Bereich (print), druckt die angegebene Variable (print var) oder druckt die Debuggervariablen (print -d).

printe[xception] [-r]

Druckt die letzte Ausnahme auf dem aktuellen Thread. Verwenden Sie die Option –r (rekursiv), um die InnerException-Eigenschaft für das Ausnahmeobjekt zu durchlaufen, um Informationen zur gesamten Ausnahmekette abzurufen.

pro[cessenum]

Zeigt die aktiven Prozesse an.

q[uit] [Beendigungscode]

Beendet die Shell MDbg.exe und gibt optional den Exitcode des Prozesses an.

re[sume] [* | [~]Threadnummer]

Setzt den aktuellen Thread oder den vom threadNumber-Parameter angegebenen Thread fort.

Wenn für den threadNumber-Parameter * angegeben wird oder die Threadnummer mit ~ beginnt, wird der Befehl auf alle Threads mit Ausnahme des durch threadNumber angegebenen Threads angewendet.

Das Fortsetzen eines nicht unterbrochenen Threads hat keine Auswirkungen.

r[un] [-d(ebug) | -o(ptimize) |-enc] [[path_to_exe] [args_to_exe]]

Beendet den aktuellen Prozess, sofern vorhanden, und startet einen neuen. Wenn kein ausführbares Argument übergeben wird, führt dieser Befehl das Programm aus, das zuvor mit dem run-Befehl ausgeführt wurde. Wird das ausführbare Argument bereitgestellt, wird das angegebene Programm mit den optional angegebenen Argumenten ausgeführt.

Wenn Ladeereignisse für Klassen und Module sowie Threadstartereignisse ignoriert werden (dies entspricht der Standardeinstellung), wird das Programm bei der ersten ausführbaren Anweisung des Hauptthreads angehalten.

Sie können den Debugger zur JIT-Kompilierung (Just-In-Time) des Codes zwingen, indem Sie eines der drei folgenden Flags verwenden:

  • -d(ebug) deaktiviert Optimierungen. Dies ist der Standard für MDbg.exe.

  • Von -o(ptimize) wird eine Ausführung des Codes erzwungen, die der außerhalb des Debuggers ähnelt. Allerdings wird das Debuggen dabei auch erschwert. Dies ist die Standardeinstellung für die Verwendung außerhalb des Debuggers.

  • -enc aktiviert das Feature Bearbeiten und Fortfahren, beeinträchtigt jedoch die Leistung.

Set Variable=Wert

Ändert den Wert einer im Gültigkeitsbereich befindlichen Variable.

Sie können auch eigene Debuggervariablen erstellen und diesen Verweiswerte innerhalb der Anwendung zuweisen. Diese Werte fungieren als Handles zum ursprünglichen Wert, und auch der ursprüngliche Wert liegt außerhalb des Bereichs. Alle Debuggervariablen müssen mit $ beginnen (z. B. $var). Löschen Sie diese Handles, indem Sie sie mit dem folgenden Befehl auf keinen Wert festlegen:

set $var=

Setip [-il] Zahl

Legt den aktuellen Anweisungszeiger (Instruction Pointer, IP) in der Datei auf die angegebene Position fest. Wenn Sie die -il-Option angeben, stellt die Zahl einen MSIL-Offset (Microsoft Intermediate Language) in der Methode dar. Andernfalls stellt die Zahl eine Quellzeilennummer dar.

sh[ow] [Zeilen]

Gibt die Anzahl der anzuzeigenden Zeilen an.

s[tep]

Wechselt mit der Ausführung in die nächste Funktion der aktuellen Zeile oder wechselt zur nächsten Zeile, wenn keine Funktion vorhanden ist, zu der gewechselt werden kann.

su[spend] [* | [~]Threadnummer]

Bricht den aktuellen Thread oder den vom threadNumber-Parameter angegebenen Thread ab. Wenn threadNumber als * angegeben wird, wird der Befehl auf alle Threads angewendet. Beginnt die Threadnummer mit ~, wird der Befehl für alle Threads mit Ausnahme des durch threadNumber angegebenen Threads angewendet. Unterbrochene Threads werden von der Ausführung ausgeschlossen, wenn der Prozess entweder durch den go-Befehl oder den step-Befehl ausgeführt wird. Wenn sich keine nicht unterbrochenen Threads im Prozess befinden und Sie den go-Befehl ausgeben, wird der Prozess nicht fortgesetzt. Drücken Sie in diesem Fall STRG+C, um den Prozess zu beeinflussen.

sy[mbol] Befehlsname [Befehlswert]

Geben Sie einen der folgenden Befehle an:

  • symbol path ["value"] – Zeigt den aktuellen Symbolpfad an oder legt diesen fest.

  • symbol addpath "value" - Fügt dem aktuellen Symbolpfad den Wert hinzu.

  • symbol reload ["module"]– Lädt entweder alle Symbole oder die Symbole für das angegebene Modul erneut.

  • symbol list [module] – Zeigt die derzeit geladenen Symbole für alle Module oder das angegebene Modul an.

t[hread] [newThread] [-nick nickname]

Der Thread-Befehl ohne Parameter zeigt alle verwalteten Threads im aktuellen Prozess an. Threads werden i. d. R. durch ihre Threadnummern bezeichnet. Wurde dem Thread jedoch ein Spitzname zugewiesen, wird stattdessen der Spitzname angezeigt. Sie können den -nick-Parameter verwenden, um einen Spitznamen einem Thread zuzuweisen.

  • thread -nick threadName weist einen Spitznamen dem aktuell ausgeführten Thread zu.

Spitznamen dürfen nicht aus Zahlen bestehen. Wenn dem aktuellen Thread bereits ein Spitzname zugewiesen wurde, wird der alte Spitzname durch den neuen ersetzt. Wenn der neue Spitzname eine leere Zeichenfolge ("") ist, wird der Spitzname für den aktuellen Thread gelöscht und dem Thread wird kein neuer Spitzname zugewiesen.

u[p]

Verschiebt den aktiven Stapelrahmen nach oben.

uwgc[handle] [var] | [address]

Druckt die von einem Handle verfolgte Variable. Das Handle kann mit dem Namen oder der Adresse angegeben werden.

When

Zeigt die derzeit aktiven when-Anweisungen an.

wenn alle löschen | num [num [num …]] - Löscht die when-Anweisung, die durch die Zahl angegeben wird, oder alle when-Anweisungen, wenn all angegeben wird.

when stopReason [specific_condition] do cmd [cmd [cmd …] ] - Der stopReason-Parameter kann einer der folgenden sein:

StepComplete, ProcessExited, ThreadCreated, BreakpointHit, ModuleLoaded, ClassLoaded, AssemblyLoaded, AssemblyUnloaded, ControlCTrapped, ExceptionThrown, UnhandledExceptionThrown, AsyncStop, AttachComplete, UserBreak, EvalComplete, EvalException, RemapOpportunityReached, NativeStop.

specific_condition kann einen der folgenden Werte haben:

  • number – Löst für ThreadCreated und BreakpointHit nur eine Aktion bei Beenden durch eine Thread-ID/Haltepunktnummer mit demselben Wert aus.

  • [!]Name – Löst für ModuleLoaded, ClassLoaded, AssemblyLoaded, AssemblyUnloaded, ExceptionThrown und UnhandledExceptionThrown nur eine Aktion aus, wenn der Name dem Namen von stopReason entspricht.

specific_condition muss für andere Werte von stopReason leer sein.

w[here] [-v] [-c depth] [threadID]

Zeigt Debuginformationen über Stapelrahmen an.

  • Die -v-Option liefert ausführliche Informationen über jeden angezeigten Stapelrahmen.

  • Durch Angeben einer Zahl für depth wird die Anzahl der angezeigten Frames beschränkt. Verwenden Sie den all-Befehl, um alle Frames anzuzeigen. Der Standardwert ist 100.

  • Wenn Sie den threadID-Parameter angeben, können Sie steuern, welcher Thread dem Stapel zugeordnet wird. Der Standardwert ist nur der aktuelle Thread. Verwenden Sie den all-Befehl, um alle Threads abzurufen.

x [-c numSymbols] [module[!pattern]]

Zeigt Funktionen an, die dem pattern für ein Modul entsprechen.

Wenn numSymbols angegeben wird, wird die Ausgabe auf die festgelegte Anzahl beschränkt. Wenn ! (das einen regulären Ausdruck angibt) für pattern nicht angegeben wird, werden alle Funktionen angezeigt. Wenn module nicht bereitgestellt wird, werden alle geladenen Module angezeigt. Symbole (~#) können verwendet werden, um Haltepunkte mit dem break-Befehl festzulegen.

Hinweise

Kompilieren Sie die zu debuggende Anwendung mit compilerspezifischen Flags, die den Compiler dazu veranlassen, Debugsymbole zu generieren. Weitere Informationen über diese Flags finden Sie in der Compilerdokumentation. Optimierte Anwendungen können gedebuggt werden; ein Teil der Debuginformationen fehlt jedoch. Viele lokale Variablen sind beispielsweise nicht sichtbar, und die Quellzeilen sind ungenau.

Geben Sie nach dem Kompilieren der Anwendung an der Befehlszeile mdbg ein, um eine Debugsitzung zu beginnen, wie das folgende Beispiel veranschaulicht.

C:\Program Files\Microsoft Visual Studio 8\VC>mdbg
MDbg (Managed debugger) v2.0.50727.42 (RTM.050727-4200) started.
Copyright (C) Microsoft Corporation. All rights reserved.

For information about commands type "help";
to exit program type "quit".
mdbg>

Die Eingabeaufforderung mdbg> zeigt an, dass Sie sich im Debugger befinden.

Sobald Sie im Debugger sind, verwenden Sie die im vorherigen Abschnitt beschriebenen Befehle und Argumente.

Siehe auch

Referenz

Visual Studio- und Windows SDK-Eingabeaufforderungen

Weitere Ressourcen

.NET Framework-Tools

Änderungsprotokoll

Datum

Versionsgeschichte

Grund

April 2011

Hinzugefügte Informationen zur Verwendung der Visual Studio- und Windows SDK-Eingabeaufforderungen.

Informationsergänzung.