Bessere Variablenerkundung beim Debuggen von C ++ - Code mit Eclipse / CDT

68

Bei Verwendung von Eclipse und CDT zum Debuggen von C ++ - Code sind die variablen Fenster umständlich und für in der Standardvorlagenbibliothek oder in boost (z. B. shared_ptr) definierte Typen nicht sehr informativ.

Nur ein Beispiel, wie dies für einen std :: vector aussehen könnte:

bar {…}
    std::_Vector_base<TSample<MyTraits>, std::allocator<TSample<MyTraits> > >   
        _M_impl {…} 
            std::allocator<TSample<MyTraits> >  {…} 
            _M_start    0x00007ffff7fb5010  
            _M_finish   0x00007ffff7fd4410  
            _M_end_of_storage   0x00007ffff7fd5010  

Selbst wenn diese Informationen über die Interna dieser Typen nützlich sein könnten, würde ich in fast allen Fällen eine klarere Darstellung hier erwarten, dh eine Liste von Werten für den std :: vector. Gibt es Tools, Plugins oder andere Modifikationen, mit denen dies möglich ist?

BEARBEITEN

Die folgenden Lösungen funktionieren nicht unter Linux. Ich benutze Ubuntu 14.04, Eclipse, G ++, GDB.

Ich kann kein Paket gdb-python finden und Linux verwendet kein Mingw

Danvil
quelle

Antworten:

28

Sie benötigen eine Version von GDB, die Python für hübsche Druckstrukturen verwenden kann. Ich weiß zumindest unter Windows mit mingw, dass dies in der Standardinstallation nicht vorgesehen ist.

Hübsche Drucker sind Python-Module, die der GDB mitteilen, wie eine bestimmte Struktur angezeigt werden soll. Sie können Ihre eigenen schreiben, aber es stehen bereits Drucker für STL zum Download zur Verfügung.

So bringen Sie Pretty Printers unter Windows zum Laufen (Anweisungen sollten für andere Betriebssysteme ähnlich sein):

Voraussetzungen

Installation:

  • Öffnen Sie eine Befehlsshell und geben Sie Folgendes ein:

    mingw-get install gdb-python
    
  • Wenn die CD fertig ist, legen Sie sie in einem lokalen Verzeichnis ab und installieren Sie die Drucker, indem Sie Folgendes eingeben:

    svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
    
  • Öffnen Sie die .gdbinit-Datei (erstellen Sie sie gegebenenfalls in einem Texteditor) und geben Sie Folgendes ein, indem Sie "C: / directory" durch den Ordner ersetzen, in den Sie die Drucker eingecheckt haben.

    Python
    importiert sys
    sys.path.insert (0, 'C: / directory')
    aus libstdcxx.v6.printers import register_libstdcxx_printers
    register_libstdcxx_printers (None)
    end

Eclipse-Setup

  • Gehen Sie zu Windows> Einstellungen> C / C ++> Debug> GDB
  • Wo es heißt, dass GDB Debugger den Pfad zu der Python-fähigen GDB angegeben hat, befindet er sich höchstwahrscheinlich im Ordner mingw / bin mit einem Namen wie gdb-python27.exe
  • Wo es heißt, GDB-Befehlsdatei Geben Sie den Pfad zu der zuvor erstellten .gdb-Init-Datei ein.

Das war's, Debuggen wie gewohnt, die STL-Strukturen sollten viel einfacher zu lesen sein.

DanChianucci
quelle
3
Können Sie bitte die Lösung für Linux geben .... Linux hat kein Mingw, und ich kann kein Paket gdb-python finden.
Rakesh Malik
Nach dem Start des Debuggens erhalte ich die Fehlermeldung "GDB-Version konnte nicht mit dem folgenden Befehl ermittelt werden: gdb-python27.exe --version".
Wahrheitssucher
Problem behoben durch Installation der 32-Bit-Version von Python anstelle von 64-Bit.
Wahrheitssucher
Wenn ich dies tue und versuche zu debuggen, bekomme ich Error in final launch sequence Failed to execute MI command: -file-exec-and-symbols D:/Dropbox/eclipse/ProofTool/Debug/ProofTool.exe Error message from debugger back end: "D:\Dropbox\eclipse\ProofTool\Debug\ProofTool.exe": not in executable format: File format not recognized "D:\Dropbox\eclipse\ProofTool\Debug\ProofTool.exe": not in executable format: File format not recognizedzu mir, es scheint, dass dies auch ein 64/32-Bit-Problem ist. Ich bin unter Windows 7 64-Bit und möchte 64-Bit-Programme debuggen. Nur 32-Bit-Python funktioniert, wie @truthseeker erwähnt
xamid
Ich bin mir jetzt ziemlich sicher, dass ich eine 64-Bit-Version von GDB benötige, aber mingw-get installiert nur eine 32-Bit-Version. Wie bekomme ich eine 64-Bit-CDB-Version (unter Windows, das Python unterstützt)? Ich stecke hier mit meiner Frage fest: stackoverflow.com/questions/18912471/…
xamid
21

Nun, GDB unterstützt STL-Container nicht von Haus aus. Sie können nicht sagen, dass dies falsch ist, da dadurch das Innenleben der STL-Objekte sichtbar wird, aber meistens ist es nicht das, was wir wollen, oder?

Wenn Sie gdb 7.0 verwenden, können Sie die hübschen Drucker nutzen. Diese Website http://sourceware.org/gdb/wiki/STLSupport enthält ein ziemlich einfaches Tutorial zum Einstellen. Ich habe unten den Teil kopiert, der Sie interessiert:

  1. Testen Sie die neuesten Python libstdc ++ - Drucker an einem Ort auf Ihrem Computer. Führen Sie in einem lokalen Verzeichnis Folgendes aus:

        svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
    
  2. Fügen Sie Ihrem ~ / .gdbinit Folgendes hinzu. Der Pfad muss mit der Stelle übereinstimmen, an der das obige Python-Modul ausgecheckt wurde. Wenn Sie also nach: / home / maude / gdb_printers / auschecken, lautet der Pfad wie im Beispiel beschrieben:

        python
        import sys
        sys.path.insert(0, '/home/maude/gdb_printers/python')
        from libstdcxx.v6.printers import register_libstdcxx_printers
        register_libstdcxx_printers (None)
        end
    

Der Pfad sollte das einzige Element sein, das im obigen Beispiel angepasst werden muss. Nach dem Laden sollten STL-Klassen, die von den Druckern unterstützt werden, in einem besser lesbaren Format gedruckt werden. Verwenden Sie zum Drucken der Klassen im alten Stil den Schalter / r (raw) im Druckbefehl (dh print / r foo). Dadurch werden die Klassen so gedruckt, als ob die Python-Pretty-Drucker nicht geladen wären.

Da Sie eclipse cdt verwenden, vergessen Sie nicht, Ihre Debug-Konfiguration auf Ihre .gdbinit-Datei zu verweisen. Wechseln Sie beim Erstellen einer neuen Debug-Konfiguration zur Registerkarte Debugger und geben Sie den Pfad zur .gdbinit-Datei in das Feld "GDB-Befehlsdatei" ein.

Ich hoffe das hilft!

pedromanoel
quelle
9
Ich habe die Anweisungen befolgt und die richtigen Pfade festgelegt, aber es funktioniert nicht. Irgendwelche Vorschläge, was falsch sein könnte?
Danvil
2
Auch unter Linux hat es bei mir nicht funktioniert. Es wurde from libstdcxx.v6.printers import register_libstdcxx_printers register_libstdcxx_printers(gdb.current_objfile()) behoben , dass die Zeilen in der Datei libstdcxx / v6 / __ init__.py auskommentiert wurden.
David Suarez
1
Es funktioniert für mich unter Linux. Allerdings musste ich den Pfad als / home / user / pathtoprettyprinters festlegen, während ~ / pathtoprettyprinters nicht funktionierte! In Eclipse musste ich den Pfad zu .gdbinit unter window-> settings-> C / C ++ -> debug-> gdb einfügen und dann meine Debug-Startkonfiguration neu erstellen, damit es funktioniert. Siehe auch hier: stackoverflow.com/questions/4985414/…
user1304680
10

Erweitern Sie in der Debug-Ansicht in der Variablenliste den Vektor:

"vector_name"-> std::_Vector_base<"datatype">->_M_impl

Klicken Sie dann mit der rechten Maustaste auf _M_startund wählen Sie "Als Array anzeigen ...", geben Sie die Länge ein und klicken Sie dann auf OK. Jetzt können Sie jedes Element Ihres Vektors erweitern.

0x0000eWan
quelle
1
Stellen Sie sicher, dass Sie erweitern, _M_startnachdem Sie "Als Array anzeigen ..." durchlaufen haben.
Garrett
1
Dies ist eine brillante Antwort. Ich weiß nicht, warum das nicht akzeptiert wurde.
Ping Localhost
2
Dies funktioniert für a, vector<T>da ein Typelement zugrunde liegt T[]. Bei anderen STL-Typen funktioniert dies nicht. Dies ist eine gute und einfache Lösung für Vektoren und Zeichenfolgen.
Ytoledano
8

Wenn Sie gdbUnterstützung für CDT(siehe z. B. GDB in Eclipse ) haben, können Sie Folgendes versuchen: De-Referenzierung von STL-Containern

Vor langer Zeit bin ich auch auf dasselbe Problem gestoßen. Es war mühsam, die STL-Behälter zu überprüfen. Dann fand ich diesen Link und fügte meiner .gdbinitDatei einige dieser Definitionen hinzu. Danach war das Leben einfacher.

HINWEIS: Meine gdbVersion ist 7.1 und das Hinzufügen dieser Definitionen funktioniert einwandfrei. Ich weiß nicht, ob sie in neueren Versionen gdbbereits enthalten sind.

Adri CS
quelle
5

Ich möchte die Windows 7-Antwort erweitern, da einige wichtige Schritte weggelassen werden:

Dies ist für MinGW-Benutzer mit Eclipse CDT

0) Wenn Sie keine Python-GDB haben, öffnen Sie eine Shell / einen Befehl und verwenden Sie MinGW-get.exe, um die Python-fähige GDB zu installieren, z

   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 eingestellt sind:

 PYTHONPATH should be C:\Python27\Lib   (or similar)
 PYTHONHOME should be C:\Python27

1c) Fügen Sie Ihrem Pfad PYTHONHOME hinzu

 %PYTHONHOME%;...

2a) Öffnen Sie eine Texteingabe und geben Sie die folgenden Anweisungen ein. Beachten Sie, dass die dritte Zeile zeigt, wo sich die Python-Skripte befinden. Siehe dazu die folgenden Hinweise!

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 unter '.gdbinit' HINWEIS: Im Windows Explorer können Sie keine Datei benennen, die mit einem Punkt aus dem Explorer beginnt. Bei den meisten Textänderungen (einschließlich Editor) können Sie. GDB-Init-Dateien sind wie 'Skripte' von GDB-Befehlen, die GBD beim Laden ausführt.

2c) Die '.gdbinit'-Datei muss sich im Arbeitsverzeichnis von GDB befinden (höchstwahrscheinlich ist dies das Stammverzeichnis Ihres Projekts, aber Ihre IDE kann es Ihnen mitteilen.

3) Öffnen Sie das Dialogfeld "Eclipse (oder andere IDE) -Einstellungen". Gehen Sie zum Untermenü C ++ Debugger.

4) Konfigurieren Sie Eclipse C:\MinGW\bin\gdb-python27.exeals Debugger und Ihre .gdbinitals Konfigurationsdatei.

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

--OR--

5b) Bearbeiten Sie jede Debug-Konfiguration und verweisen Sie auf die neue Datei gdb-python.exe UND auf die neue.

Wenn Sie auf Probleme stoßen:

- Vergessen Sie nicht, den Speicherort im obigen Python-Code in das Python-Verzeichnis zu ändern! Dieses Verzeichnis wurde von MinGW erstellt. Versuchen Sie also nicht, die hübschen Drucker herunterzuladen. MinGW hat dies in Schritt Null für Sie erledigt. Gehen Sie einfach zu Ihrem MinGW-Installationsdirektor, dem Freigabeordner, dem GCC-Ordner (mit der Versionsnummer) und Sie finden den Python-Ordner. Dieser Speicherort sollte in einem von GDB geladenen Python-Skript enthalten sein.

--Auch die .gdbinit ist eine PITA, stellen Sie sicher, dass sie korrekt benannt ist und sich im Arbeitsordner von GDB befindet, in dem sich nicht unbedingt gdb-python.exe befindet! Überprüfen Sie Ihre GDB-Ausgabe beim Laden von GDB, um festzustellen, ob a) "Python-fähig" während des Ladens angezeigt wird und ob die Anweisungen in der .gdbinit angezeigt werden.

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

- Das Verzeichnis mit 'gdb-python27' (z. B. C: \ MinGW \ bin ') sollte sich ebenfalls auf Ihrem Pfad befinden. Wenn dies der Fall ist, wird das Einrichten von Eclipse etwas einfacher, da Sie keine absoluten Pfade eingeben müssen . Trotzdem benötigt die .gbdinit manchmal einen absoulten Pfad. Wenn es funktioniert, wird beim Start des Debuggers eine Ausgabe von gbd (Konsole-> gdb-Traces) wie folgt angezeigt:

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) 
William Symionow
quelle
2

Ich weiß, dass JDT (Java-Umgebung in Eclipse) benutzerdefinierte "Formatierer" bereitstellt, die beim Anzeigen von Variablenwerten in Debug-Ansichten angewendet werden können. Ein kurzer Blick auf Google für das gleiche in CDT bringt diese Seite:

http://wiki.eclipse.org/CDT/Better_Debugging_%28GSoC_project%29

Ich weiß nicht, ob dies noch in die Haupt-CDT-Zeile integriert wurde. Möglicherweise können Sie versuchen, beim Debuggen (in der letzten CDT) mit der rechten Maustaste auf eine Variable zu klicken, um festzustellen, ob ein benutzerdefinierter Formatierungseintrag vorhanden ist. Wenn nicht verfügbar, empfehle ich Ihnen, einen neuen Tracker-Eintrag im CDT-Tracker hinzuzufügen, um diese Verbesserung anzufordern.

Manuel Selva
quelle