Entdecken Sie agentenbasierte Entwicklung –

C++-Debugging in Visual Studio Code

Nachdem Sie die Grundlagen Ihrer Debugging-Umgebung gemäß den Konfigurationsanleitungen für den jeweiligen Ziel-Compiler/die jeweilige Plattform eingerichtet haben, können Sie in diesem Abschnitt mehr Details über das Debuggen von C/C++ erfahren.

Visual Studio Code unterstützt je nach verwendetem Betriebssystem die folgenden Debugger für C/C++:

  • Linux: GDB
  • macOS: LLDB oder GDB
  • Windows: der Visual Studio Windows Debugger oder GDB (unter Verwendung von Cygwin oder MinGW)

Windows-Debugging mit GDB

Sie können Windows-Anwendungen, die mit Cygwin oder MinGW erstellt wurden, mit VS Code debuggen. Um die Debugging-Funktionen von Cygwin oder MinGW zu nutzen, muss der Pfad zum Debugger manuell in der Startkonfiguration (launch.json) festgelegt werden. Um Ihre Cygwin- oder MinGW-Anwendung zu debuggen, fügen Sie die Eigenschaft miDebuggerPath hinzu und setzen Sie den Wert auf den Speicherort der entsprechenden gdb.exe für Ihre Cygwin- oder MinGW-Umgebung.

Zum Beispiel

    "miDebuggerPath": "c:\\mingw\\bin\\gdb.exe"

Das Cygwin/MinGW-Debugging unter Windows unterstützt sowohl das Anfügen an Prozesse als auch das Starten von Debugging-Szenarien.

Um mehr zu erfahren, siehe C/C++ Debugging konfigurieren.

Wenn Sie mit GDB unter Windows debuggen, siehe Windows-Debugging mit MinGW64.

Bedingte Haltepunkte

Bedingte Breakpoints ermöglichen es Ihnen, die Ausführung an einer bestimmten Codezeile nur dann zu unterbrechen, wenn die Bedingung wahr (true) ist. Um einen bedingten Breakpoint zu setzen, klicken Sie mit der rechten Maustaste auf einen vorhandenen Breakpoint und wählen Sie Breakpoint bearbeiten. Dadurch öffnet sich ein kleines Fenster, in dem Sie die Bedingung eingeben können, die während des Debuggens erfüllt sein muss, damit der Breakpoint greift.

A conditional break

Im Editor werden bedingte Breakpoints durch ein Breakpoint-Symbol mit einem schwarzen Gleichheitszeichen darin angezeigt. Sie können den Cursor über einen bedingten Breakpoint bewegen, um dessen Bedingung anzuzeigen.

Funktions-Breakpoints

Funktions-Breakpoints ermöglichen es Ihnen, die Ausführung am Anfang einer Funktion zu unterbrechen, anstatt an einer bestimmten Codezeile. Um einen Funktions-Breakpoint zu setzen, klicken Sie in der Ausführen-Ansicht mit der rechten Maustaste in den Bereich Breakpoints, wählen Sie dann Funktions-Breakpoint hinzufügen und geben Sie den Namen der Funktion ein, an der die Ausführung unterbrochen werden soll.

Auswertung von Ausdrücken

VS Code unterstützt die Auswertung von Ausdrücken in verschiedenen Kontexten:

  • Sie können einen Ausdruck in den Bereich Überwachen (Watch) der Ausführen-Ansicht eingeben; er wird jedes Mal ausgewertet, wenn ein Breakpoint erreicht wird.
  • Sie können einen Ausdruck in die Debug-Konsole eingeben; er wird nur einmal ausgewertet.
  • Sie können jeden Ausdruck auswerten, der in Ihrem Code erscheint, während Sie an einem Breakpoint gestoppt haben.

Ausdrücke im Bereich Überwachen wirken sich auf die Anwendung aus, die gerade debuggt wird; ein Ausdruck, der den Wert einer Variablen ändert, ändert diese Variable für die Dauer des Programms.

Multi-Threaded-Debugging

Die C/C++-Erweiterung für VS Code bietet die Möglichkeit, Multi-Threaded-Programme zu debuggen. Alle Threads und deren Aufrufstapel (Call Stacks) erscheinen im Bereich Aufrufstapel.

Multi-threaded process

Speicherauszug-Debugging (Core Dump)

Die C/C++-Erweiterung für VS Code bietet zudem die Möglichkeit, Speicherauszüge (Core Dumps) zu debuggen. Um einen Speicherauszug zu debuggen, öffnen Sie Ihre launch.json-Datei und fügen Sie die Eigenschaft coreDumpPath (für GDB oder LLDB) oder dumpPath (für den Visual Studio Windows Debugger) zur C++ Start-Konfiguration hinzu. Setzen Sie den Wert auf eine Zeichenfolge, die den Pfad zum Speicherauszug enthält. Dies funktioniert sogar für x86-Programme, die auf einer x64-Maschine debuggt werden.

Zusätzliche Symbole

Falls es zusätzliche Verzeichnisse gibt, in denen der Debugger Symboldateien finden kann (z. B. .pdb-Dateien für den Visual Studio Windows Debugger), können diese durch Hinzufügen von additionalSOLibSearchPath (für GDB oder LLDB) oder symbolSearchPath (für den Visual Studio Windows Debugger) angegeben werden.

Zum Beispiel

    "additionalSOLibSearchPath": "/path/to/symbols;/another/path/to/symbols"

oder

    "symbolSearchPath": "C:\\path\\to\\symbols;C:\\another\\path\\to\\symbols"

Quellcodedateien lokalisieren

Der Speicherort der Quelldateien kann geändert werden, wenn sich die Dateien nicht am Kompilierungsort befinden. Dies geschieht durch einfache Ersetzungspaare, die im Abschnitt sourceFileMap hinzugefügt werden. Die erste Übereinstimmung in dieser Liste wird verwendet.

Zum Beispiel

"sourceFileMap": {
    "/build/gcc-4.8-fNUjSI/gcc-4.8-4.8.4/build/i686-linux-gnu/libstdc++-v3/include/i686-linux-gnu": "/usr/include/i686-linux-gnu/c++/4.8",
    "/build/gcc-4.8-fNUjSI/gcc-4.8-4.8.4/build/i686-linux-gnu/libstdc++-v3/include": "/usr/include/c++/4.8"
}

GDB-, LLDB- und LLDB-MI-Befehle (GDB/LLDB)

Für die Debugging-Umgebung C++ (GDB/LLDB) können Sie GDB-, LLDB- und LLDB-MI-Befehle direkt über die Debug-Konsole mit dem Befehl -exec ausführen. Seien Sie jedoch vorsichtig: Das direkte Ausführen von Befehlen in der Debug-Konsole ist nicht getestet und kann in manchen Fällen zum Absturz von VS Code führen.

Weitere Debugging-Funktionen

  • Unbedingte Breakpoints
  • Überwachungsfenster
  • Aufrufstapel (Call Stack)
  • Einzelschritte (Stepping)

Weitere Informationen zum Debuggen mit VS Code finden Sie in dieser Einführung zum Thema Debugging in VS Code.

Für weitere Möglichkeiten zur Konfiguration der launch.json-Datei, um Ihre C/C++-App zu debuggen, siehe C/C++ Debugging konfigurieren.

Natvis-Framework

Sie können benutzerdefinierte Ansichten für C++-Objekte im Debugger mit dem Natvis-Framework erstellen. Lesen Sie das Thema Benutzerdefinierte Ansichten für native Objekte für Details zur Verwendung von Natvis mit der C/C++-Erweiterung.

Remote-Debugging

Informationen zum Anfügen an einen Remote-Prozess, wie z. B. das Debuggen eines Prozesses in einem Docker-Container, finden Sie unter Pipe-Transport.

Den Debugger debuggen

Wenn Sie ein Debugging-Problem mit der Erweiterung haben, das wir anhand der Informationen in Ihrem Fehlerbericht nicht diagnostizieren können, bitten wir Sie möglicherweise, die Protokollierung zu aktivieren und uns Ihre Protokolle zu senden. Siehe Protokollierung für den Debug-Adapter aktivieren, um zu erfahren, wie Sie Protokolle der C/C++-Erweiterung erhalten.

Bekannte Einschränkungen

Symbole und Code-Navigation

Alle Plattformen

  • Da die Erweiterung Funktionsrümpfe nicht analysiert, funktionieren Peek Definition und Go to Definition nicht für Symbole, die innerhalb eines Funktionsrumpfes definiert sind.

Debugging

Windows

  • GDB unter Cygwin und MinGW kann einen laufenden Prozess nicht unterbrechen. Um einen Breakpoint zu setzen, während die Anwendung läuft (nicht im Debugger gestoppt), oder um die Anwendung zu pausieren, drücken Sie Strg+C im Terminal der Anwendung.
  • GDB unter Cygwin kann keine Core Dumps öffnen.

Linux

  • Möglicherweise erhalten Sie die Fehlermeldung: ptrace: Operation not permitted. Dies liegt daran, dass GDB erhöhte Berechtigungen benötigt, um an einen Prozess anzufügen. Dies kann mit den folgenden Lösungen behoben werden:
    1. Bei Verwendung von An Prozess anfügen müssen Sie Ihr Passwort eingeben, bevor die Debugging-Sitzung beginnen kann.

    2. Um diesen Fehler vorübergehend zu deaktivieren, verwenden Sie den folgenden Befehl:

      echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

    3. Um den Fehler dauerhaft zu beheben, fügen Sie eine Datei namens 10-ptrace.conf in /etc/sysctl.d/ hinzu und fügen Sie kernel.yama.ptrace_scope = 0 hinzu.

macOS

  • LLDB
    • Wenn beim Debuggen mit LLDB das Terminal-Fenster im Unterbrechungsmodus geschlossen wird, stoppt das Debugging nicht. Das Debugging kann durch Drücken der Stop-Taste beendet werden.
    • Wenn das Debugging gestoppt wird, wird das Terminal-Fenster nicht geschlossen.
  • GDB
    • Für die Verwendung von GDB auf macOS sind zusätzliche manuelle Installationsschritte erforderlich. Siehe Manual Installation of GDB for OS X in der README.
    • Beim Anfügen an einen Prozess mit GDB kann die zu debuggende Anwendung nicht unterbrochen werden. GDB bindet nur Breakpoints, die gesetzt wurden, während die Anwendung nicht läuft (entweder vor dem Anfügen an die Anwendung oder während sich die Anwendung in einem gestoppten Zustand befindet). Dies liegt an einem Fehler in GDB.
    • Speicherauszüge können beim Debuggen mit GDB nicht geladen werden, da GDB das unter macOS verwendete Format für Speicherauszüge nicht unterstützt.
    • Wenn mit GDB an einen Prozess angefügt wurde, beendet "Alles unterbrechen" (break-all) den Prozess.

Nächste Schritte

Lesen Sie weiter, um mehr über Folgendes zu erfahren:

Wenn Sie weitere Fragen haben oder auf Probleme stoßen, erstellen Sie bitte ein Issue auf GitHub.

© . This website operates independently and is not affiliated with or endorsed by Microsoft. All brand names, logos, and trademarks are the property of their respective owners.