.NET Framework-Befehlszeilendebugger (MDbg.exe)
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. Der Quellcode für MDbg.exe ist als Beispielanwendung im Lieferumfang von .NET Framework SDK enthalten. Entwickler können den Code studieren, um sich mit der Verwendung der Debugdienste vertraut zu machen. Gegenwärtig können Sie mit MDbg.exe lediglich verwalteten Code debuggen. Das Debuggen von nicht verwaltetem Code wird nicht unterstützt.
MDbg [ProgramName[Program arguments]] [optional arguments ]
command [command arguments]
Befehle
Befehl | Beschreibung |
---|---|
ap[rocess] [number] |
Wechselt zu einem anderen gedebuggten Prozess oder druckt verfügbare Prozesse. Bei den Zahlen handelt es sich nicht um tatsächliche PIDs, sondern um 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 sequenziell durchsucht. 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. |
ca[tch] [exceptionType] |
Bewirkt, dass der Debugger nicht nur bei den nicht behandelten Ausnahmen, sondern bei allen Ausnahmen unterbricht. |
conf[ig] [option value] |
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 derzeit verfügbaren Optionen sind: extpath: Legt den Pfad fest, an dem nach Erweiterungen gesucht wird, wenn der load-Befehl verwendet wird. extpath+: Fügt den vorhandenen Pfaden einen Pfad hinzu, aus dem Erweiterungen geladen werden können. |
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. |
ex[it] [exitcode] |
Beendet die Shell MDbg.exe und gibt optional den Exitcode des Prozesses an. |
fo[reach] [OtherCommand] |
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] functionName [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. Beispiel: Mit diesem Befehl wird die Funktion |
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] [command] oder ? [command] |
Zeigt eine Beschreibung aller Befehle oder eine ausführliche Beschreibung eines angegebenen Befehls an. |
ig[nore] [event] |
Bewirkt, dass der Debugger nur bei nicht behandelten Ausnahmen anhält. |
int[ercept] FrameNumber |
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|assemblies] |
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. |
mo[de] [option on/off] |
Legt andere Debuggeroptionen fest. Der option-Parameter sollte aus zwei Buchstaben bestehen. |
newo[bj] typeName [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). |
o[ut] |
Wechselt zum Ende der aktuellen Funktion. |
pa[th] [pathName] |
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). |
pro[cessenum] |
Zeigt die aktiven Prozesse an. |
q[uit] [exitcode] |
Beendet die Shell MDbg.exe und gibt optional den Exitcode des Prozesses an. |
re[sume] [*|[~]threadNumber] |
Setzt den aktuellen Thread oder den vom threadNumber-Parameter angegebenen Thread fort. Wenn für den threadNumber-Parameter 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 die JIT (Just-In-Time)-Kompilierung des Codes durch den Debugger mit allen drei gültigen Flags erzwingen: -d(ebug) ist die Standardeinstellung für MDbg.exe und deaktiviert Optimierungen. -o(ptimize) ist die Standardeinstellung für die Verwendung außerhalb des Debuggers. Hiermit wird eine Ausführung des Codes erzwungen, die der außerhalb des Debuggers ähnelt. Allerdings wird das Debuggen dabei auch erschwert. -enc aktiviert das Feature Bearbeiten und Fortfahren, beeinträchtigt jedoch die Leistung. |
Set variable=value |
Ä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, auch wenn sich der ursprüngliche Wert außerhalb des Bereichs befindet. Alle Debuggervariablen müssen mit $ beginnen (z. B. |
Setip [-il] number |
Legt den aktuellen Anweisungszeiger (Instruction Pointer, IP) in der Datei auf die angegebene Position fest. Wenn die -il-Option angegeben wird, stellt die Zahl einen Intermediate Language-Offset in der Methode dar. Andernfalls stellt die Zahl eine Quellzeilennummer dar. |
sh[ow] [lines] |
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] [*|[~]threadNumber] |
Bricht den aktuellen Thread oder den vom threadNumber-Parameter angegebenen Thread ab. Wenn threadNumber als |
sy[mbol] commandName [commandValue] |
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 name] |
Weist dem derzeit aktiven Thread name als Spitznamen zu. Der Spitzname kann statt des Threadnamens verwendet werden. 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 Spitzname "" ist, wird der Spitzname für den aktuellen Thread gelöscht, und dem Thread wird kein neuer Spitzname zugewiesen. thread newThread – Legt den aktiven Thread auf newThread fest. newThread kann entweder ein Spitzname für den Thread oder eine Threadnummer sein. Thread –- Zeigt alle verwalteten Threads im aktuellen Prozess an. Threads werden i. d. R. durch ihre Threadnummer bezeichnet. Wurde dem Thread jedoch ein Spitzname zugewiesen, wird stattdessen der Spitzname angezeigt. |
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. when delete all | num [num [num …]] – Löscht die durch die Nummer angegebene when-Anweisung oder alle when-Anweisungen, wenn all angegeben wird. when stopReason [specific_condition] do cmd [cmd [cmd …] ] – Der stopReason-Parameter kann Folgendes sein: StepComplete, ProcessExited, ThreadCreated, BreakpointHit, ModuleLoaded, ClassLoaded, AssemblyLoaded, AssemblyUnloaded, ControlCTrapped, ExceptionThrown, UnhandledExceptionThrown, AsyncStop, AttachComplete, UserBreak, EvalComplete, EvalException, RemapOpportunityReached, NativeStop. specific_condition kann Folgendes sein: 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 enthält 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. Die 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 !regex 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. |
Hinweis
Bei Befehlen für MDbg.exe wird die Groß- und Kleinschreibung berücksichtigt.
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 nach wie vor 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:
D:\Program Files\FrameworkSDK\Bin>MDbg
MDbg (Managed debugger) v2.0.50215.44 (beta2.050215-4400) 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.
Wenn Sie sich im Debugger befinden, rufen Sie die erforderlichen Funktionen mithilfe der Befehle und entsprechender Argumente auf.