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.
|
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:
|
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:
|
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:
|
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.
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:
specific_condition muss für andere Werte von stopReason leer sein. |
w[here] [-v] [-c depth] [threadID] |
Zeigt Debuginformationen über Stapelrahmen an.
|
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
Änderungsprotokoll
Datum |
Versionsgeschichte |
Grund |
---|---|---|
April 2011 |
Hinzugefügte Informationen zur Verwendung der Visual Studio- und Windows SDK-Eingabeaufforderungen. |
Informationsergänzung. |