Verwenden von Haltepunkten im Visual Studio-Debugger

  • 06/30/2020
  • 12 minuten zum Lesen
    • M
    • g
    • j
    • v
    • g
    • +8

Haltepunkte sind eine der wichtigsten Debugging-Techniken in der Toolbox Ihres Entwicklers. Sie legen Haltepunkte überall dort fest, wo Sie die Debuggerausführung anhalten möchten. Sie können beispielsweise den Status von Codevariablen anzeigen oder den Aufrufstapel an einem bestimmten Haltepunkt anzeigen. Wenn Sie versuchen, eine Warnung oder ein Problem bei der Verwendung von Haltepunkten zu beheben, finden Sie Informationen unter Beheben von Haltepunkten im Visual Studio-Debugger.

Hinweis

Wenn Sie die Aufgabe oder das Problem kennen, das Sie lösen möchten, aber wissen müssen, welche Art von Haltepunkt verwendet werden soll, lesen Sie FAQ – Finden Sie Ihre Debugging-Funktion.

Haltepunkte im Quellcode festlegen

Sie können einen Haltepunkt in jeder Zeile ausführbaren Codes festlegen. Im folgenden C # -Code können Sie beispielsweise einen Haltepunkt in der Codezeile mit der Variablenzuweisung (int testInt = 1), der for -Schleife oder einem beliebigen Code innerhalb der for -Schleife festlegen. Sie können keinen Haltepunkt für Methodensignaturen, Deklarationen für einen Namespace oder eine Klasse oder Variablendeklarationen festlegen, wenn keine Zuweisung und kein Getter / Setter vorhanden sind.

Um einen Haltepunkt im Quellcode festzulegen, klicken Sie ganz links neben einer Codezeile auf. Sie können auch die Zeile auswählen und F9 drücken, Debug > Haltepunkt umschalten auswählen oder mit der rechten Maustaste klicken und Haltepunkt > Haltepunkt einfügen auswählen. Der Haltepunkt wird als roter Punkt am linken Rand angezeigt.

Für die meisten Sprachen, einschließlich C#, werden Haltepunkt- und aktuelle Ausführungszeilen automatisch hervorgehoben. Für C++ -Code können Sie die Hervorhebung von Haltepunkten und aktuellen Zeilen aktivieren, indem Sie Tools (oder Debug) > Options > Debugging > Highlight entire source line for breakpoints and current statement (nur C++) auswählen.

Haltepunkt setzen

Beim Debuggen wird die Ausführung am Haltepunkt angehalten, bevor der Code in dieser Zeile ausgeführt wird. Das Haltepunktsymbol zeigt einen gelben Pfeil.

Am Haltepunkt im folgenden Beispiel ist der Wert von testInt immer noch 1. Der Wert hat sich also seit der Initialisierung der Variablen (auf den Wert 1) nicht geändert, da die gelbe Anweisung noch nicht ausgeführt wurde.

Haltepunktausführung gestoppt

Wenn der Debugger am Haltepunkt stoppt, können Sie den aktuellen Status der App einschließlich der Variablenwerte und des Aufrufstapels anzeigen.

Hier sind einige allgemeine Anweisungen zum Arbeiten mit Haltepunkten.

  • Der Haltepunkt ist ein Toggle. Sie können darauf klicken, F9 drücken oder den Haltepunkt Debug > Toggle verwenden, um ihn zu löschen oder erneut einzufügen.

  • Um einen Haltepunkt zu deaktivieren, ohne ihn zu löschen, bewegen Sie den Mauszeiger darüber oder klicken Sie mit der rechten Maustaste darauf, und wählen Sie Haltepunkt deaktivieren. Deaktivierte Haltepunkte werden als leere Punkte am linken Rand oder im Fenster Haltepunkte angezeigt. Um einen Haltepunkt wieder zu aktivieren, bewegen Sie den Mauszeiger darüber oder klicken Sie mit der rechten Maustaste darauf, und wählen Sie Haltepunkt aktivieren.

  • Legen Sie Bedingungen und Aktionen fest, fügen Sie Beschriftungen hinzu und bearbeiten Sie sie, oder exportieren Sie einen Haltepunkt, indem Sie mit der rechten Maustaste darauf klicken und den entsprechenden Befehl auswählen.

Breakpoint-Aktionen und Tracepoints

Ein Tracepoint ist ein Haltepunkt, der eine Nachricht in das Ausgabefenster druckt. Ein Tracepoint kann sich in der Programmiersprache wie eine temporäre Trace-Anweisung verhalten und unterbricht die Ausführung von Code nicht. Sie erstellen einen Tracepoint, indem Sie im Fenster Haltepunkteinstellungen eine spezielle Aktion festlegen. Detaillierte Anweisungen finden Sie unter Verwenden von Tracepoints im Visual Studio-Debugger.

Haltepunktbedingungen

Sie können steuern, wann und wo ein Haltepunkt ausgeführt wird, indem Sie Bedingungen festlegen. Die Bedingung kann ein beliebiger gültiger Ausdruck sein, den der Debugger erkennt. Weitere Informationen zu gültigen Ausdrücken finden Sie unter Ausdrücke im Debugger.

So legen Sie eine Haltepunktbedingung fest:

  1. Klicken Sie mit der rechten Maustaste auf das Haltepunktsymbol und wählen Sie Bedingungen (oder drücken Sie Alt + F9, C). Oder bewegen Sie den Mauszeiger über das Haltepunktsymbol, wählen Sie das Symbol Einstellungen und dann Bedingungen im Fenster Haltepunkteinstellungen aus.

    Sie können Bedingungen auch im Fenster Haltepunkte festlegen, indem Sie mit der rechten Maustaste auf einen Haltepunkt klicken und Einstellungen und dann Bedingungen auswählen.

    Haltepunkteinstellungen

  2. Wählen Sie in der Dropdown-Liste Bedingter Ausdruck, Trefferanzahl oder Filter aus, und legen Sie den Wert entsprechend fest.

  3. Wählen Sie Schließen oder drücken Sie Strg+Eingabetaste, um das Fenster Haltepunkteinstellungen zu schließen. Oder wählen Sie im Fenster Haltepunkte die Option OK, um das Dialogfeld zu schließen.

Haltepunkte mit festgelegten Bedingungen werden im Fenster Quellcode und Haltepunkte mit einem + -Symbol angezeigt.

Bedingten Ausdruck erstellen

Wenn Sie Bedingten Ausdruck auswählen, können Sie zwischen zwei Bedingungen wählen: Ist wahr oder Wenn geändert. Choose Ist true, um zu brechen, wenn der Ausdruck erfüllt ist, oder Wenn geändert, um zu brechen, wenn sich der Wert des Ausdrucks geändert hat.

Im folgenden Beispiel wird der Haltepunkt nur dann erreicht, wenn der Wert von testInt 4 ist:

Haltepunktbedingung ist wahr

Im folgenden Beispiel wird der Haltepunkt nur dann erreicht, wenn sich der Wert von testInt ändert:

 Haltepunkt bei Änderung

Wenn Sie eine Haltepunktbedingung mit ungültiger Syntax festlegen, wird eine Warnmeldung angezeigt. Wenn Sie eine Haltepunktbedingung mit gültiger Syntax, aber ungültiger Semantik angeben, wird beim ersten Erreichen des Haltepunkts eine Warnmeldung angezeigt. In beiden Fällen bricht der Debugger ab, wenn er den ungültigen Haltepunkt erreicht. Der Haltepunkt wird nur übersprungen, wenn die Bedingung gültig ist und false ergibt.

Hinweis

Für das Feld When changed betrachtet der Debugger die erste Bewertung der Bedingung nicht als Änderung und erreicht daher bei der ersten Bewertung nicht den Haltepunkt.

Objekt-IDs in bedingten Ausdrücken verwenden (nur C# und F#)

Manchmal möchten Sie das Verhalten eines bestimmten Objekts beobachten. Sie möchten beispielsweise herausfinden, warum ein Objekt mehr als einmal in eine Sammlung eingefügt wurde. In C # und F # können Sie Objekt-IDs für bestimmte Instanzen von Referenztypen erstellen und diese unter Haltepunktbedingungen verwenden. Die Objekt-ID wird von den Common Language Runtime (CLR) -Debugdiensten generiert und dem Objekt zugeordnet.

So erstellen Sie eine Objekt-ID:

  1. Setzen Sie einen Haltepunkt im Code, nachdem das Objekt erstellt wurde.

  2. Wenn die Ausführung am Haltepunkt angehalten wird, wählen Sie Debug > Windows > Locals (oder drücken Sie Strg + Alt + V, L), um das Fenster Locals zu öffnen.

    Suchen Sie die spezifische Objektinstanz im Fenster Locals, klicken Sie mit der rechten Maustaste darauf und wählen Sie Objekt-ID erstellen.

    Sie sollten ein $ plus eine Zahl im lokalen Fenster sehen. Dies ist die Objekt-ID.

  3. Fügen Sie an der zu untersuchenden Stelle einen neuen Haltepunkt hinzu, z. B. wenn das Objekt der Sammlung hinzugefügt werden soll. Klicken Sie mit der rechten Maustaste auf den Haltepunkt und wählen Sie Bedingungen.

  4. Verwenden Sie die Objekt-ID im Feld Bedingter Ausdruck. Wenn beispielsweise die Variable item das Objekt ist, das der Auflistung hinzugefügt werden soll, ist select true und geben Sie item == $<n> ein, wobei <n> die Objekt-ID-Nummer ist.

    Die Ausführung wird an dem Punkt unterbrochen, an dem das Objekt zur Sammlung hinzugefügt werden soll.

    Um die Objekt-ID zu löschen, klicken Sie im Fenster Locals mit der rechten Maustaste auf die Variable und wählen Sie Objekt-ID löschen.

Hinweis

Objekt-IDs erzeugen schwache Referenzen und verhindern nicht, dass das Objekt Garbage Collected wird. Sie sind nur für die aktuelle Debugsitzung gültig.

Festlegen einer Trefferzählungsbedingung

Wenn Sie vermuten, dass sich eine Schleife in Ihrem Code nach einer bestimmten Anzahl von Iterationen schlecht benimmt, können Sie einen Haltepunkt festlegen, um die Ausführung nach dieser Anzahl von Treffern zu stoppen, anstatt wiederholt F5 drücken zu müssen, um diese Iteration zu erreichen.

Wählen Sie im Fenster Haltepunkteinstellungen unter Bedingungen die Option Trefferanzahl aus, und geben Sie dann die Anzahl der Iterationen an. Im folgenden Beispiel wird der Haltepunkt bei jeder anderen Iteration auf Treffer gesetzt:

Anzahl der Haltepunkttreffer

Filterbedingung festlegen

Sie können einen Haltepunkt so einschränken, dass er nur auf bestimmten Geräten oder in bestimmten Prozessen und Threads ausgelöst wird.

Wählen Sie im Fenster Haltepunkteinstellungen unter Bedingungen die Option Filter aus, und geben Sie dann einen oder mehrere der folgenden Ausdrücke ein:

  • MachineName = “Name”
  • ProcessID = Wert
  • ProcessName = “Name”
  • ThreadID = Wert
  • ThreadName = “name”

Schließen Sie Zeichenfolgenwerte in doppelte Anführungszeichen ein. Sie können Klauseln mit & (AND), || (OR), ! (NOT) und Klammern kombinieren.

Funktionshaltepunkte setzen

Sie können die Ausführung unterbrechen, wenn eine Funktion aufgerufen wird. Dies ist beispielsweise nützlich, wenn Sie den Funktionsnamen, aber nicht dessen Speicherort kennen. Es ist auch nützlich, wenn Sie Funktionen mit demselben Namen haben und Sie alle unterbrechen möchten (z. B. überladene Funktionen oder Funktionen in verschiedenen Projekten).

So legen Sie einen Funktionshaltepunkt fest:

  1. Wählen Sie Debug > Neuer Haltepunkt > Funktion Haltepunkt, oder drücken Sie Strg + K, B.

    Im Fenster Haltepunkte können Sie auch die Funktion Haltepunkt Neu > auswählen.

  2. Geben Sie im Dialogfeld Neuer Funktionshaltepunkt den Funktionsnamen in das Feld Funktionsname ein.

    Zum Eingrenzen der Funktionsspezifikation:

    • Verwenden Sie den vollqualifizierten Funktionsnamen.

      Beispiel: Namespace1.ClassX.MethodA()

    • Fügen Sie die Parametertypen einer überladenen Funktion hinzu.

      Beispiel: MethodA(int, string)

    • Verwenden Sie die ‘!’ Symbol, um das Modul anzugeben.

      Beispiel: App1.dll!MethodA

    • Verwenden Sie den Kontextoperator in nativem C ++.

      {function, , }

      Beispiel: {MethodA, , App1.dll}+2

  3. Wählen Sie im Dropdown-Menü Sprache die Sprache der Funktion aus.

  4. Wählen Sie OK.

Festlegen eines Funktionshaltepunkts mithilfe einer Speicheradresse (nur natives C ++)

Sie können die Adresse eines Objekts verwenden, um einen Funktionshaltepunkt für eine Methode festzulegen, die von einer bestimmten Instanz einer Klasse aufgerufen wird. Bei einem adressierbaren Objekt vom Typ my_class können Sie beispielsweise einen Funktionshaltepunkt für die my_method -Methode festlegen, die von der Instanz aufgerufen wird.

  1. Legen Sie irgendwo einen Haltepunkt fest, nachdem die Instanz der Klasse instanziiert wurde.

  2. Suchen Sie die Adresse der Instanz (z. B. 0xcccccccc).

  3. Wählen Sie Debug > Neuer Haltepunkt > Funktion Haltepunkt, oder drücken Sie Strg + K, B.

  4. Fügen Sie dem Feld Funktionsname Folgendes hinzu, und wählen Sie die Sprache C ++ aus.

    ((my_class *) 0xcccccccc)->my_method

Festlegen von Datenhaltepunkten (.NET Core 3.0 oder höher)

Datenhaltepunkte unterbrechen die Ausführung, wenn sich die Eigenschaft eines bestimmten Objekts ändert.

So legen Sie einen Datenhaltepunkt fest

  1. Starten Sie in einem .NET Core-Projekt das Debuggen und warten Sie, bis ein Haltepunkt erreicht ist.

  2. Klicken Sie im Fenster Autos, Watch oder Locals mit der rechten Maustaste auf eine Eigenschaft, und wählen Sie im Kontextmenü die Option Break when value changes aus.

    Haltepunkt für verwaltete Daten

Datenhaltepunkte in .NET Core funktionieren nicht für:

  • Eigenschaften, die im Tooltip-, Locals-, Autos- oder Watch-Fenster nicht erweiterbar sind
  • Statische Variablen
  • Klassen mit dem DebuggerTypeProxy-Attribut
  • Felder innerhalb von Strukturen

Festlegen von Datenhaltepunkten (nur natives C ++)

Datenhaltepunkte unterbrechen die Ausführung, wenn sich ein an einer angegebenen Speicheradresse gespeicherter Wert ändert. Wenn der Wert gelesen, aber nicht geändert wird, wird die Ausführung nicht unterbrochen.

So legen Sie einen Datenhaltepunkt fest:

  1. Starten Sie in einem C ++ – Projekt das Debuggen und warten Sie, bis ein Haltepunkt erreicht ist. Wählen Sie im Menü Debug die Option Neuer Haltepunkt > Datenhaltepunkt.

    Sie können im Fenster Haltepunkte auch den neuen > -Datenhaltepunkt auswählen oder mit der rechten Maustaste auf ein Element im Fenster Autos, Watch oder Locals klicken und im Kontextmenü die Option Bei Wertänderung abbrechen auswählen.

  2. Geben Sie im Feld Adresse eine Speicheradresse oder einen Ausdruck ein, der als Speicheradresse ausgewertet wird. Geben Sie beispielsweise &avar ein, um den Inhalt der Variablen avar zu ändern.

  3. Wählen Sie in der Dropdown-Liste Byteanzahl die Anzahl der Bytes aus, die der Debugger überwachen soll. Wenn Sie beispielsweise 4 auswählen, überwacht der Debugger die vier Bytes ab &avar und unterbricht sie, wenn eines dieser Bytes den Wert ändert.

Datenhaltepunkte funktionieren unter den folgenden Bedingungen nicht:

  • Ein Prozess, der nicht debuggt wird, schreibt in den Speicherort.
  • Der Speicherort wird von zwei oder mehr Prozessen gemeinsam genutzt.
  • Der Speicherort wird im Kernel aktualisiert. Wenn beispielsweise Speicher an die 32-Bit-Windows ReadFile -Funktion übergeben wird, wird der Speicher aus dem Kernelmodus aktualisiert, sodass der Debugger beim Update nicht unterbrochen wird.
  • Wobei der watch-Ausdruck größer als 4 Byte auf 32-Bit-Hardware und 8 Byte auf 64-Bit-Hardware ist. Dies ist eine Einschränkung der x86-Architektur.

Hinweis

  • Datenhaltepunkte hängen von bestimmten Speicheradressen ab. Die Adresse einer Variablen ändert sich von einer Debugsitzung zur nächsten, sodass Datenhaltepunkte am Ende jeder Debugsitzung automatisch deaktiviert werden.

  • Wenn Sie einen Datenhaltepunkt für eine lokale Variable festlegen, bleibt der Haltepunkt aktiviert, wenn die Funktion endet, aber die Speicheradresse ist nicht mehr anwendbar, sodass das Verhalten des Haltepunkts unvorhersehbar ist. Wenn Sie einen Datenhaltepunkt für eine lokale Variable festlegen, sollten Sie den Haltepunkt löschen oder deaktivieren, bevor die Funktion endet.

Haltepunkte verwalten im Fenster Haltepunkte

Im Fenster Haltepunkte können Sie alle Haltepunkte in Ihrer Lösung anzeigen und verwalten. Dieser zentrale Speicherort ist besonders hilfreich in einer großen Lösung oder für komplexe Debugging-Szenarien, in denen Haltepunkte kritisch sind.

Im Fenster Haltepunkte können Sie Haltepunkte suchen, sortieren, filtern, aktivieren/deaktivieren oder löschen. Sie können auch Bedingungen und Aktionen festlegen oder eine neue Funktion oder einen neuen Datenhaltepunkt hinzufügen.

Um das Breakpoints-Fenster zu öffnen, wählen Sie Debug > Windows > Breakpoints aus, oder drücken Sie Strg+Alt+B.

Breakpoints-Fenster

Um die Spalten auszuwählen, die im Breakpoints-Fenster angezeigt werden sollen, wählen Sie Spalten anzeigen. Wählen Sie eine Spaltenüberschrift aus, um die Liste der Haltepunkte nach dieser Spalte zu sortieren.

Haltepunktbeschriftungen

Sie können Beschriftungen verwenden, um die Liste der Haltepunkte im Fenster Haltepunkte zu sortieren und zu filtern.

  1. Um einem Haltepunkt eine Beschriftung hinzuzufügen, klicken Sie im Fenster Quellcode oder Haltepunkte mit der rechten Maustaste auf den Haltepunkt, und wählen Sie dann Beschriftungen bearbeiten aus. Fügen Sie ein neues Label hinzu oder wählen Sie ein vorhandenes aus, und wählen Sie dann OK.
  2. Sortieren Sie die Haltepunktliste im Fenster Haltepunkte, indem Sie die Beschriftungen, Bedingungen oder andere Spaltenüberschriften auswählen. Sie können die anzuzeigenden Spalten auswählen, indem Sie Spalten anzeigen in der Symbolleiste auswählen.

Haltepunkte exportieren und importieren

Um den Status und die Position Ihrer Haltepunkte zu speichern oder freizugeben, können Sie sie exportieren oder importieren.

  • Um einen einzelnen Haltepunkt in eine XML-Datei zu exportieren, klicken Sie im Fenster Quellcode oder Haltepunkte mit der rechten Maustaste auf den Haltepunkt, und wählen Sie Exportieren oder Exportieren ausgewählt. Wählen Sie einen Exportspeicherort und dann Speichern aus. Der Standardspeicherort ist der Lösungsordner.
  • Um mehrere Haltepunkte zu exportieren, markieren Sie im Fenster Haltepunkte die Kästchen neben den Haltepunkten oder geben Sie Suchkriterien in das Suchfeld ein. Wählen Sie das Symbol Alle Haltepunkte exportieren, die den aktuellen Suchkriterien entsprechen, und speichern Sie die Datei.
  • Um alle Haltepunkte zu exportieren, deaktivieren Sie alle Felder und lassen Sie das Suchfeld leer. Wählen Sie das Symbol Alle Haltepunkte exportieren, die den aktuellen Suchkriterien entsprechen, und speichern Sie die Datei.
  • Um Haltepunkte zu importieren, wählen Sie im Fenster Haltepunkte das Symbol Haltepunkte aus einer Datei importieren aus, navigieren Sie zum Speicherort der XML-Datei und wählen Sie Öffnen.

Setzen von Haltepunkten aus Debugger-Fenstern

Sie können auch Haltepunkte aus den Aufruf-Stack- und Disassemblierungs-Debugger-Fenstern setzen.

Setzen Sie einen Haltepunkt im Aufrufstapelfenster

Um an der Anweisung oder Zeile zu brechen, zu der eine aufrufende Funktion zurückkehrt, können Sie einen Haltepunkt im Aufrufstapelfenster setzen.

So legen Sie einen Haltepunkt im Aufrufstapelfenster fest:

  1. Um das Fenster Aufrufstapel zu öffnen, müssen Sie während des Debuggens angehalten werden. Wählen Sie Debug > Windows > Call Stack aus, oder drücken Sie Strg+Alt+C.

  2. Klicken Sie im Fenster Aufrufstapel mit der rechten Maustaste auf die aufrufende Funktion und wählen Sie Haltepunkt > Haltepunkt einfügen aus, oder drücken Sie F9.

    Neben dem Funktionsaufrufnamen wird am linken Rand des Aufrufstapels ein Haltepunktsymbol angezeigt.

Der Aufrufstapel-Haltepunkt wird im Fenster Haltepunkte als Adresse mit einem Speicherort angezeigt, der der nächsten ausführbaren Anweisung in der Funktion entspricht.

Der Debugger bricht bei der Anweisung ab.

Weitere Informationen zum Anrufstapel finden Sie unter Vorgehensweise: Verwenden des Fensters Anrufstapel.

Um Haltepunkte während der Codeausführung visuell zu verfolgen, siehe Methoden auf dem Aufrufstapel beim Debuggen zuordnen.

Setzen Sie einen Haltepunkt im Disassemblierungsfenster

  1. Um das Demontagefenster zu öffnen, müssen Sie während des Debuggens angehalten werden. Wählen Sie Debug > Windows > Disassemblierung aus, oder drücken Sie Strg+Alt+D.

  2. Klicken Sie im Demontagefenster auf den linken Rand der Anweisung, an der Sie brechen möchten. Sie können es auch auswählen und F9 drücken oder mit der rechten Maustaste klicken und Haltepunkt > Haltepunkt einfügen auswählen.

Siehe auch

  • Was ist Debugging?
  • Besseren C # -Code mit Visual Studio schreiben
  • Erster Blick auf das Debuggen
  • Fehlerbehebung bei Haltepunkten im Visual Studio-Debugger

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.