Navigieren durch Code mithilfe des Visual Studio-Debuggers

Gilt für:yesVisual Studio noVisual Studio für MacnoVisual Studio Code

Mit dem Visual Studio-Debugger können Sie durch Code navigieren, um den Zustand einer App zu überprüfen und deren Ausführungsablauf anzuzeigen. Dieser Vorgang wird auch als Codeausführung in Einzelschritten bezeichnet. Sie können Tastenkombinationen, Debugbefehle, Haltepunkte und andere Funktionen verwenden, um schnell zu dem Code zu gelangen, den Sie untersuchen möchten. Wenn Sie mit den Navigationsbefehlen und Tastaturkurzbefehlen des Debuggers vertraut sind, können Sie App-Probleme schneller und einfacher finden und beheben.

Hinweis

Wenn Sie noch nicht mit dem Debuggen von Code vertraut sind, sollten Sie Debuggen für Anfänger und Debugverfahren und --tools lesen, bevor Sie diesen Artikel lesen.

Wechseln in den Unterbrechungsmodus

Im Unterbrechungsmodus wird die Ausführung der App angehalten, während Funktionen, Variablen und Objekte im Speicher verbleiben. Wenn sich der Debugger im Unterbrechungsmodus befindet, können Sie durch Ihren Code navigieren. Es gibt zwei gängige Möglichkeiten, schnell in den Unterbrechungsmodus zu wechseln:

  • Beginnen Sie mit der Codeausführung in Einzelschritten, indem Sie F10 oder F11 auswählen. Auf diese Weise können Sie den Einstiegspunkt Ihrer App schnell finden. Sie können dann durch das Drücken von Schrittbefehlen fortfahren, um durch den Code zu navigieren.

  • Führen Sie beispielsweise bis zu einer bestimmten Position oder Funktion aus, indem Sie einen Haltepunkt festlegen und Ihre App starten.

    Im Code-Editor in Visual Studio können Sie beispielsweise den Befehl Ausführen bis Cursor verwenden, um die App mit angefügtem Debugger zu starten. Sie können anschließend in den Unterbrechungsmodus wechseln und dann F11 auswählen, um durch den Code zu navigieren:

    Animation: Das Auswählen von „Ausführen bis Cursor“ und dann F11

    Animation: Das Auswählen von „Ausführen bis Cursor“ und dann F11

Wenn Sie sich im Unterbrechungsmodus befinden, können Sie verschiedene Befehle verwenden, um durch Ihren Code zu navigieren. Sie können die Werte von Variablen untersuchen, um nach Verstößen und Fehlern zu suchen. Bei einigen Projekttypen können Sie auch Anpassungen an der App vornehmen, wenn Sie sich im Unterbrechungsmodus befinden.

Die meisten Debuggerfenster, wie die Fenster Module und Überwachen, sind nur verfügbar, wenn der Debugger an Ihre App angefügt ist. Manche Debuggerfeatures, wie das Anzeigen von Variablenwerten im Fenster Lokal oder das Auswerten von Ausdrücken im Fenster Überwachen sind nur verfügbar, wenn der Debugger angehalten (d.h. im Unterbrechungsmodus) ist.

Hinweis

Wenn Sie Code unterbrechen, in dem keine Quell- oder Symboldateien (PDB-Dateien) geladen sind, zeigt der Debugger die Seite Source Files Not Found (Quelldateien wurden nicht gefunden) oder Symbols Not Found (Symbole wurden nicht gefunden) an, auf denen Sie Dateien suchen und laden können. Weitere Informationen finden Sie unter Angeben von Symbol- und Quelldateien. Wenn Sie die Symbol- oder Quelldateien nicht laden können, können Sie dennoch die Assemblyanweisungen im Fenster Disassembly debuggen.

Codeausführung in Einzelschritten

Mithilfe der Schrittbefehle des Debuggers können Sie den Zustand Ihrer App untersuchen oder mehr über deren Ausführungsablauf erfahren.

Einzelschritt.

Um beim Debuggen jede Anweisung anzuhalten, verwenden Sie Debug>Einzelschritt, oder wählen Sie F11 aus.

Der Debugger durchläuft Codeanweisungen und nicht physische Zeilen. Beispielsweise kann eine if-Klausel in eine Zeile geschrieben werden:

int x = 42;
string s = "Not answered";
if( int x == 42) s = "Answered!";

Wenn Sie diese Zeile jedoch schrittweise ausführen, behandelt der Debugger die Bedingung als einen Schritt und die Folge als einen anderen. Im vorherigen Beispiel ist die Bedingung TRUE.

Bei einem geschachtelten Funktionsaufruf führt Einzelschritt die am tiefsten geschachtelte Funktion in Einzelschritten aus. Wenn Sie beispielsweise Hineinspringen für einen Aufruf wie Func1(Func2()) verwenden, führt der Debugger die Funktion Func2 schrittweise aus.

Tipp

Wenn Sie jede Codezeile ausführen, können Sie mit dem Mauszeiger auf Variablen zeigen, um ihre Werte anzuzeigen, oder die Fenster Lokal und Überwachung verwenden, um die Änderung der Werte zu überwachen. Sie können die Aufrufliste auch visuell verfolgen, während Sie Funktionen schrittweise ausführen. (Weitere Informationen, die nur für Visual Studio Enterprise gelten, finden Sie unter Zuordnen von Methoden in der Aufrufliste beim Debuggen.)

Durchlaufen von Code und Überspringen einiger Funktionen

Möglicherweise interessieren Sie sich beim Debuggen nicht für eine Funktion. Vielleicht wissen Sie auch, dass manche Teile des Codes, z. B. gut getesteter Bibliothekscode, funktionieren. Sie können die folgenden Befehle verwenden, um Code bei der Ausführen in Einzelschritten zu überspringen. Die Funktionen werden weiterhin ausgeführt, aber der Debugger überspringt sie.

Tastaturbefehl Menübefehle für das Debuggen Beschreibung
F10 Prozedurschritt Wenn die aktuelle Zeile einen Funktionsaufruf enthält, führt Überspringen den Code aus und hält dann die Ausführung in der ersten Codezeile an, nachdem die aufgerufene Funktion zurückgegeben wurde.
UMSCHALT+F11 Ausführen bis Rücksprung Herausspringen führt weiterhin Code aus und hält die Ausführung an, wenn die aktuelle Funktion Werte zurückgibt. Der Debugger überspringt die aktuelle Funktion.

Ausführen bis zu einer bestimmten Position oder Funktion

Möglicherweise ziehen Sie es vor, direkt bis zu einer bestimmten Position oder Funktion auszuführen, wenn Sie genau wissen, welchen Code Sie untersuchen oder wo Sie mit dem Debuggen beginnen möchten.

Ausführen bis zu einem Haltepunkt im Code

Um einen einfachen Breakpoint in Ihrem Code festzulegen, wählen Sie den linken Rand neben der Codezeile aus, in der Sie die Ausführung anhalten möchten. Sie können auch die Zeile auswählen und dann F9 auswählen, anschließend Debug>Haltepunkt umschalten auswählen oder mit der rechten Maustaste klicken und Haltepunkt>Haltepunkt einfügen auswählen. Der Breakpoint wird als roter Punkt am linken Rand neben der Codezeile angezeigt. Der Debugger hält die Ausführung an, kurz bevor die Zeile ausgeführt wird.

Screenshot: Festlegen eines Breakpoints

Screenshot: Festlegen eines Breakpoints

Breakpoints in Visual Studio bieten umfangreiche Funktionen, z. B. bedingte Breakpoints und Ablaufverfolgungspunkte. Weitere Informationen finden Sie unter Verwenden von Breakpoints im Visual Studio-Debugger.

Ausführen bis zu einem Funktionshaltepunkt

Sie können festlegen, dass der Debugger ausgeführt wird, bis er eine angegebene Funktion erreicht. Sie können die Funktion anhand ihres Namens angeben oder in der Aufrufliste auswählen.

Angeben eines Funktionshaltepunkts anhand des Namens

  1. Wählen Sie Debug>Neuer Haltepunkt>Funktionshaltepunkt aus.

  2. Geben Sie im Dialogfeld Neuer Funktionshaltepunkt den Namen der Funktion ein, und wählen Sie ihre Sprache aus:

    Screenshot: Das Dialogfeld „Neuer Funktionshaltepunkt“

    Screenshot: Das Dialogfeld „Neuer Funktionshaltepunkt“

  3. Klicken Sie auf OK.

Wenn die Funktion überladen oder in mehr als einem Namespace vorhanden ist, können Sie im Fenster Haltepunkte den gewünschten Namespace auswählen:

Screenshot: Breakpointfenster.

Screenshot: Breakpointfenster.

Auswählen eines Funktionshaltepunkts aus der Aufrufliste

  1. Öffnen Sie während des Debuggens das Fenster Aufrufliste, indem Sie auf Debuggen>Fenster>Aufrufliste klicken.

  2. Klicken Sie im Fenster Aufrufliste mit der rechten Maustaste auf eine Funktion, und wählen Sie Ausführen bis Cursor aus, oder wählen Sie Strg+F10 aus.

Weitere Informationen zur visuellen Ablaufverfolgung der Aufrufliste finden sie unter Zuordnen von Methoden in der Aufrufliste beim Debuggen.

Ausführen bis zur Cursorposition

Wählen Sie zum Ausführen bis zur Cursorposition im Quellcode oder im Fenster Aufrufliste die Zeile aus, an der Sie unterbrechen möchten. Klicken Sie mit der rechten Maustaste, und wählen Sie Ausführen bis Cursor aus, oder wählen Sie Strg+F10 aus. Das Auswählen von Run To Cursor (Ausführen bis Cursor) ist wie das Festlegen eines temporären Haltepunkts.

Erzwingen der Ausführung bis zur Cursorposition

Wählen Sie zum Ausführen bis zur Cursorposition im Quellcode oder im Fenster Aufrufliste die Zeile aus, an der Sie unterbrechen möchten. Klicken Sie dann mit der rechten Maustaste, und wählen Sie Force Run To Cursor (Ausführung bis Cursor erzwingen) aus. Wenn Sie Force Run to Cursor (Ausführung bis Cursor erzwingen) auswählen, werden alle Breakpoints und Ausnahmen (erste Chance) übersprungen, bis der Debugger die Codezeile erreicht, in der sich der Cursor befindet.

Ausführung bis Klick

Während die Ausführung des Debuggers angehalten ist, können Sie im Quellcode oder im Fenster Disassemblierung auf eine Anweisung zeigen und das grüne Pfeilsymbol Ausführung bis hier ausführen. auswählen. Wenn Sie Run to Click (Ausführen bis Klick) verwenden, müssen Sie keinen temporären Breakpoint festlegen.

Screenshot: „Run to Click“ (Ausführen bis Klick) und der grüne Pfeil

Hinweis

Run to Click (Ausführen bis Klick) ist ab Visual Studio 2017 verfügbar.

Erzwingen von „Ausführen bis Klick“

Wenn die Ausführung des Debuggers angehalten ist, können Sie mit dem Mauszeiger auf eine Anweisung im Quellcode zeigen, während Sie die UMSCHALT-Taste drücken, und dann Force run execution to here (Ausführung bis hier erzwingen) (der grüne Doppelpfeil) auswählen. Wenn Sie diese Option auswählen, fügt die Anwendung den Visual Studio-Debugger an und hält an der Cursorposition an. Alle Breakpoints und Ausnahmen (erste Chance), die während der Ausführung gefunden wurden, werden vorübergehend deaktiviert.

Screenshot: Force Run to Click (Ausführen bis Klick erzwingen)

Hinweis

Force Run to Click (Erzwingen von „Ausführen bis Klick“) ist ab Visual Studio 2022 verfügbar.

Manuelles Unterbrechen im Code

Wählen Sie Debuggen>Alle unterbrechen aus, oder wählen Sie Strg+Alt+Unterbrechen aus, um in einer ausgeführten App in der nächsten verfügbaren Codezeile zu unterbrechen.

Bewegen des Zeigers zum Ändern des Ausführungsablaufs

Wenn die Ausführung des Debuggers angehalten ist, markiert ein gelber Pfeil am Rand des Quellcodes oder des Fensters Disassemblierung die Position der Anweisung, die als Nächstes ausgeführt wird. Sie können ändern, welche Anweisung als Nächstes ausgeführt wird, indem Sie diesen Pfeil verschieben. Sie können Code überspringen oder zu einer vorherigen Zeile zurückkehren. Das Verschieben des Zeigers ist nützlich für Situationen wie das Überspringen von Code, der einen bekannten Fehler enthält.

Animation: Bewegen des Zeigers

Animation: Bewegen des Zeigers

Wenn Sie die nächste auszuführende Anweisung ändern möchten, muss sich der Debugger im Unterbrechungsmodus befinden. Ziehen Sie den gelben Pfeil im Quellcode oder im Fenster Disassemblierung auf eine andere Zeile, oder klicken Sie mit der rechten Maustaste auf die Zeile, die Sie als Nächstes ausführen möchten, und wählen Sie Nächste Anweisung festlegen aus.

Der Programmzähler springt sofort an die neue Position. Anweisungen zwischen den alten und neuen Ausführungspunkten werden nicht ausgeführt. Wenn Sie den Ausführungspunkt jedoch rückwärts verschieben, werden die Unterbrechungsanweisungen nicht rückgängig gemacht.

Achtung

  • Das Verschieben der nächsten Anweisung in eine andere Funktion oder einen anderen Bereich verursacht in der Regel eine Beschädigung der Aufrufliste, was zu einem Laufzeitfehler oder einer Ausnahme führt. Wenn Sie versuchen, die nächste Anweisung in einen anderen Bereich zu verschieben, gibt Ihnen der Debugger eine Warnung und die Möglichkeit, den Vorgang abzubrechen.
  • In Visual Basic können Sie die nächste Anweisung nicht in einen anderen Bereich oder eine andere Funktion verschieben.
  • Wenn in nativem C++ Laufzeitüberprüfungen aktiviert sind, kann das Festlegen der nächsten Anweisung eine Ausnahme verursachen, wenn die Ausführung das Ende der Methode erreicht.
  • Wenn Bearbeiten und Fortfahren aktiviert ist, schlägt Nächste Anweisung festlegen fehl, wenn Sie Änderungen vorgenommen haben, die Bearbeiten und Fortfahren nicht sofort neu zuordnen können. Diese Situation kann beispielsweise auftreten, wenn Sie Code in einem catch-Block bearbeitet haben. In diesem Fall werden Sie in einer Fehlermeldung darüber informiert, dass der Vorgang nicht unterstützt wird.
  • In verwaltetem Code können Sie die nächste Anweisung nicht verschieben, wenn:
    • Die nächste Anweisung und die aktuelle Anweisung befinden sich in verschiedenen Methoden.
    • Das Debuggen wurde über Just-In-Time-Debuggen gestartet.
    • Die Aufrufliste wird gerade entladen.
    • Eine System.StackOverflowException oder eine System.Threading.ThreadAbortException wurden ausgelöst.

Debuggen von IDE-generiertem Code

Der Debugger versucht standardmäßig, durch Aktivieren der Einstellung Nur eigenen Code nur Ihren App-Code zu debuggen. Weitere Informationen dazu, wie dieses Feature für verschiedene Projekttypen und Sprachen funktioniert, und wie Sie es anpassen können, finden Sie unter Nur mein Code.

Sie können „Nur eigenen Code“ deaktivieren, um während des Debuggens Frameworkcode, Bibliothekscode von Drittanbietern oder Systemaufrufe zu überprüfen. Deaktivieren Sie in Extras (oder Debug) >Optionen>Debuggen das Kontrollkästchen Nur eigenen Code aktivieren. Wenn „Nur eigenen Code“ deaktiviert ist, wird im Debuggerfenster IDE-generierter Code angezeigt, und der Debugger kann den IDE-generierten Code schrittweise ausführen.

Hinweis

„Nur mein Code“ wird für Geräteprojekte nicht unterstützt.

Debuggen von Systemcode

Wenn Sie Debugsymbole für Microsoft-Systemcode geladen und „Nur mein Code“ deaktiviert haben, können Sie einen Systemaufruf genau wie jeden anderen Aufruf schrittweise ausführen.

Weitere Informationen zum Laden von Microsoft-Symbolen finden Sie unter Konfigurieren der Symboldateispeicherorte und Ladeoptionen.

So laden Sie Symbole für eine bestimmte Systemkomponente herunter:

  1. Öffnen Sie während des Debuggens das Fenster Module, indem Sie Debug>Windows>Module auswählen oder indem Sie Strg+Alt+u auswählen.

  2. Im Fenster Module können Sie feststellen, für welche Module Symbole in der Spalte Symbolstatus geladen sind. Klicken Sie mit der rechten Maustaste auf das Modul, für das Sie Symbole laden möchten, und wählen Sie dann Load Symbols (Symbole laden) aus.

Schrittweise Ausführung von Eigenschaften und Operatoren in verwaltetem Code

Standardmäßig überspringt der Debugger die Eigenschaften und Operatoren in verwaltetem Code. In den meisten Fällen bietet dieses Verhalten eine bessere Debugerfahrung. Wählen Sie Debug>Optionen aus, um das schrittweise Ausführen in Eigenschaften oder Operatoren zu deaktivieren. Deaktivieren Sie auf der Seite Debuggen>Allgemein das Kontrollkästchen Eigenschaften und Operatoren überspringen (nur verwaltet) .

Siehe auch