8 Stimmen

Steuerung der Eclipse CDT-Debugger-Ausgabe?

Wenn ich CDT verwende, möchte ich, dass std::string im 'Variablen'-Debug-Fenster mit dem darin enthaltenen String angezeigt wird. Zum Beispiel, wenn es derzeit das Wort "history" enthält, möchte ich history im Debugger-Fenster mit der Beschriftung "Variablen" sehen.

Ich denke, dass es eine allgemeine Möglichkeit gibt, in Objekte einzudringen, aber ich kann nicht darauf kommen. Weiß jemand da draußen, wie man das macht?

Dies wäre auch nützlich für mich, wenn ich nur ein Feld aus einem komplexen Objekt ausgeben möchte.

Danke, Bill

22voto

rpseng Punkte 221

Anzeigen von stl-Containern mit Eclipse/GDB war für mich auch lange Zeit eine große Herausforderung.

Aber jetzt habe ich gerade entdeckt, dass die neueste Version von GDB mit Python-Unterstützung dabei helfen kann.

Es folgt, was ich gemacht habe (unter Verwendung von Ubuntu Linux 8.10):

  • Installiere gdb Version >= 6.8.50 (zum Beispiel von Debian Experimental)
  • Erstelle eine Datei namens .gdbinit in deinem Projektstammverzeichnis mit folgendem Inhalt:

    python import gdb.libstdcxx.v6.printers

Jetzt werden die stl-Container schön formatiert ausgegeben.

Wenn du überprüfen möchtest, ob du bereits ein mit Python aktiviertes GDB hast (oder ob deine neue Installation funktioniert hat):

  • Starte gdb von der Konsole aus

  • Gib am gdb-Prompt folgendes ein

    (gdb) python print 'Python-fähiges GDB funktioniert!'

  • Wenn der obige Befehl das erzeugt, was wir erwarten, funktioniert es.

Weitere Details findest du unter diesem Blog.

1 Stimmen

+1 Das sind gute Sachen. Ich hatte eine verdammte Zeit, sie zum Laufen zu bringen mit Gentoo. Das Erstellen von GDB mit Python-Unterstützung war ein Kinderspiel (Setzen des USE-Flags), aber das gdb.libstdcxx-Modul war nicht enthalten. Schließlich fand ich es hier: sourceware.org/gdb/wiki/STLSupport

0 Stimmen

Hatte ein wenig Probleme, das zum Laufen zu bringen. Der Code, der aus SVN überprüft wurde, hatte "import gdb" auskommentiert, was einen Fehler verursachte. Nachdem ich diese Zeile wieder einkommentiert hatte, funktionierte es von der Kommandozeile aus. Um es innerhalb von Eclipse zum Laufen zu bringen, musste ich die Debug-Konfiguration bearbeiten, um meine angepasste .gdbinit-Datei auszuwählen. Jetzt, da alles eingerichtet ist, kann ich eine sinnvolle gedruckte Version der meisten STL-Datenstrukturen sehen. Sehr erfreut, dass dies endlich verfügbar ist!

0 Stimmen

Oh, und noch eine kleine Anmerkung. Anstatt mit svn:// auszuchecken, habe ich http:// verwendet.

1voto

JesperE Punkte 61161

Beachten Sie, dass Sie nicht einen allgemeinen Weg zum Durchsuchen von Objekten wünschen; Sie möchten STL-Container schön formatiert darstellen.

Ich denke, CDT delegiert dies an das Debugger-Backend; d.h. es liegt an Ihrem Debugger (gdb, vielleicht?), CDT über den Wert einer Variablen und deren Erweiterung zu informieren.

Bearbeitung: Ich glaube nicht, dass das mit CDT gelieferte GDB-Backend irgendeine Unterstützung für eine "intelligente" Anzeige von STL-Containern hat. Wenn Sie wirklich daran interessiert sind, würde ich vorschlagen, dass Sie sich an das CDT-Entwicklungsteam unter cdt-dev@eclipse.org wenden.

Aktualisierung/Bearbeitung: Bitte beachten Sie andere Antworten unten für Anweisungen, wie Sie Pretty-Printers in CDT aktivieren können.

1voto

Chris Seddon Punkte 11

Windows 7

Holen Sie sich die schönen Drucker: svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python

Richten Sie Eclipse mit ein: C/C++ Debug Gdb:

C:\\MinGW\\bin\\gdb-python27.exe
C:\\MinGW\\bin\\.gdbinit

1voto

William Symionow Punkte 730

Ich möchte auf die Windows 7 Antwort eingehen, weil einige wichtige Schritte fehlen:

Dies ist für MinGW-Benutzer mit Eclipse CDT

0) Wenn Sie kein Python GDB haben, öffnen Sie eine Shell/Eingabeaufforderung und verwenden Sie MinGW-get.exe, um 'Python-enabled GDB' zu 'installieren', z. B.

MinGw-get.exe install gdb-python

1a) Holen Sie sich Python 2.7.x von http://python.org/download/ und installieren Sie es

1b) Stellen Sie sicher, dass PYTHONPATH und PYTHONHOME in Ihrer Umgebung festgelegt sind:

 PYTHONPATH sollte C:\Python27\Lib sein (oder ähnlich)
 PYTHONHOME sollte C:\Python27 sein

1c) Fügen Sie PYTHONHOME Ihrem PATH hinzu

 %PYTHONHOME%;...

2a) Öffnen Sie einen Texteditor, geben Sie die folgenden Anweisungen ein. Beachten Sie, dass in der 3. Zeile auf den Speicherort der Python-Skripte verwiesen wird. Informationen zu diesem Thema erhalten Sie weiter unten!

python
import sys
sys.path.insert(0, 'C:/MinGW/share/gcc-4.6.1/python')         
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end

2b) Speichern Sie als '.gdbinit' HINWEIS: Der Windows-Explorer lässt Sie keine Datei mit einem Punkt zu beginnen, benennen. Die meisten Texteditoren (einschließlich Notepad) lassen dies zu. GDB Init-Dateien sind wie 'Skripte' von GDB-Befehlen, die GBD beim Laden ausführen wird.

2c) Die Datei '.gdbinit' muss im Arbeitsverzeichnis von GDB liegen (meistens ist dies das Stammverzeichnis Ihrer Projekte, Ihr IDE kann Ihnen dies mitteilen).

3) Öffnen Sie Ihren Eclipse (oder ein anderes IDE) Einstellungsdialog. Gehen Sie zum Untermenü C++ Debugger.

4) Konfigurieren Sie Eclipse, um C:\MinGW\bin\gdb-python27.exe als Debugger und Ihre .gdbinit als Konfigurationsdatei zu verwenden.

5a) Erstellen Sie alle Ihre Debug-Startkonfigurationen erneut (löschen Sie die alte und erstellen Sie eine neue von Grund auf).

--ODER--

5b) Bearbeiten Sie jede Debug-Konfiguration und geben Sie den neuen gdb-python.exe und geben Sie den neuen gdb-python27.exe und zeigen Sie darauf.

Wenn Sie auf Probleme stoßen:

--Vergessen Sie nicht, den Speicherort für das Python-Verzeichnis im obigen Python-Code zu ändern! Dieses Verzeichnis wird von MinGW erstellt, suchen Sie also nicht danach, um die schönen Drucker zu downloaden, MinGW hat es in Schritt Null für Sie erledigt. Gehen Sie einfach zu Ihrem MinGW-Installationsverzeichnis, dem Share-Ordner, dem GCC-Ordner (hat die Versionsnummer) und Sie finden den Python-Ordner. Dieser Speicherort ist der, der im von GDB geladenen Python-Skript stehen sollte.

--Außerdem, die .gdbinit ist eine PITA, stellen Sie sicher, dass sie korrekt benannt ist und sich im Arbeitsverzeichnis von GDB befindet, was nicht unbedingt dort ist, wo gdb-python.exe liegt! Sehen Sie sich die Ausgabe Ihres GDB an, wenn GDB geladen wird, um zu sehen, ob a) 'python-enabled' während des Ladens erscheint und ob die Anweisungen in der .gdbinit-Datei erscheinen.

--Schließlich hatte ich viele Probleme mit den Systemvariablen. Wenn Python 'ImportError' gibt, haben Sie höchstwahrscheinlich PYTHONPATH oder PYTHONHOME nicht festgelegt.

--Das Verzeichnis mit 'gdb-python27' (z. B. C:\MinGW\bin') sollte auch in Ihrem Pfad sein, und wenn es das ist, erleichtert es die Einrichtung von Eclipse, da Sie nicht absolute Pfade eingeben müssen. Manchmal braucht jedoch die .gbdinit einen absolten Pfad. Wenn es funktioniert, werden Sie Ausgaben von Gbd sehen (Konsole->GDB-Spuren) wie diese beim Start des Debuggers:

835,059 4^done
835,059 (gdb) 
835,059 5-enable-pretty-printing
835,069 5^done
....
835,129 12^done
835,129 (gdb) 
835,129 13source C:\MinGW\bin\.gdbinit
835,139 &"source C:\\MinGW\\bin\\.gdbinit\n"
835,142 13^done
835,142 (gdb)

0voto

Der einzige Weg, den ich gefunden habe, ist die Verwendung der GDB-Befehlszeile:

  1. In dem Debug Fenster auf gdb klicken. Es befindet sich direkt unter dem Stack-Trace.
  2. In dem Console Fenster den GDB-Befehl up verwenden, um zum gewünschten Stack-Frames zu gelangen
  3. Erneut in dem Console Fenster den Befehl print verwenden, um die std::string Variable anzuzeigen:

    p mystring

Aber das ist ziemlich umständlich.

Etwas, das ich bemerkt habe, ist, dass wenn ich über die Variable schwebe, die Felder des std::string tatsächlich angezeigt werden, aber es ist abgeschnitten, sodass ich den interessantesten Teil nicht sehe: den String-Wert. Vielleicht gibt es eine Möglichkeit, die maximale Länge des angezeigten Werts zu erhöhen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X