GNU gdb (Debugger), MinGW, Eclipse und wxWidgets
| Februar 26, 2012 | Veröffentlicht von Andreas Wittmann unter Entwicklung |
|
Debuggen unter Eclipse (C++/CDT) ist eine feine Sache sofern man es mit einfachen Datentypen wie Long, Char* usw. zu tun hat. Komplexere Datenstrukturen wie zB. ein wxString von wxWidgets spucken allerdings nur in sehr mühsamer Weise wertvolle Informationen aus. Zwar kann man sich über Expressions (wxString::ToAscii().m_str) ein wenig “retten” doch ein effizientes Debuggen ist damit nicht möglich.
Abhilfe schafft hier der PrettyPrint Modus von GDB. Anhand dieser Funktionen können Variablen in der unterschiedlichsten Art und Weise dargestellt werden. Kleiner Nachteil: Der GNU Debugger gdb muss Python-Scripts ausführen können (gdb-python27.exe) und Python selbst soll natürlich auch installiert sein. Mehr ist allerdings dann nicht mehr notwendig.
Idealerweise erstellt man ein gdbinit-File welches ungefähr folgenden Inhalt hat:
set print pretty on set print object on set print static-members on set print vtbl on set print demangle on set demangle-style gnu-v3 set print sevenbit-strings off source c:\dev\python\wxwidgets.gdb
Entscheidend ist hier allerdings nur die letzte Zeile welche eine Datei namens wxwidgets.gdb einbindet. Diese Datei hier downloaden und im Dateisystem ablegen (Die source Direktive dem Pfad entsprechend anpassen!) Den Code von wxwidgets.gdb habe ich größtenteils aus dem Internet, allerdings ein wenig modifiziert damit er auch direkt mittels source von GDB aufgerufen werden kann.
In Eclipse stellt man in den Debugging Settings nun noch einen Verweise auf die gerade erstellte gdbinit ein und – Fertig! Schon kann ein wxString direkt in der Debugging-View sichtbar gemacht werden.
Zeiger werden allerdings keine berücksichtigt und so wird anstatt eines dereferenzierten wxString* lediglich die Speicheradresse angezeigt. Deshalb gibt es von wxwidgets.gdb eine zweite Version welche auch den Inhalt eines wxString* berücksichtigt. Nachdem ich kein Python-Profi bin ist es möglich das dieser Code eventuell nicht optimal ist, jedenfalls funktioniert er bei mir wunderbar.
Hier kann diese erweiterte Version heruntergeladen werden: wxwidgets1.gdb (mit Pointer)
Weiterführende links:
http://forums.codeblocks.org/index.php/topic,12747.0.html
http://svn.wxwidgets.org/viewvc/wx/wxWidgets/trunk/misc/gdb/print.py
http://forums.codeblocks.org/index.php/topic,15050.msg101768.html





Am besten direkt von der MinGW-Seite downloaden.
http://sourceforge.net/projects/mingw/files/MinGW/Extension/gdb/GDB-7.4/
Die Datei nennt sich gdb-python-7.4-2-mingw32-bin.tar.lzma
Die darin befindlichen Dateien nach c:\mingw32\bin kopieren (je nachdem wo mingw installiert ist)
Hoffe das hilft
P.S.: Bei tdm-gcc dürfte gdb-python automatisch dabei sein. Habe aber gerade keine Möglichkeit dies zu testen.
Hallo,
wie kann ich die Datei gdb-python27.exe finden. Leider kann ich es nicht in MinGW Folder sehen.
danke vielmals
gdb-7.4 verwenden. Hier wurde der Bug behoben!
Der Fehler tritt bei lokalen, nicht initialisierten Variablen auf! Scheinbar ist das ein Bug von gdb, keine Ahnung welche Workarounds es dafür gibt
Scheinbar wird hier (to_string) eine Exception geworfen und sobald man diese abfängt crasht gdb-python27.exe auch nicht mehr. Sollte man in wxwidgets.gdb berücksichtigen. tmp ist wichtig da man sonst dennoch gdb zum Abstürzen bringt!
def to_string(self):
try:
tmp = self.val['m_pchData'].string()
return tmp
except:
return “FAILURE”
Funktioniert einwandfrei. gdb-python27.exe crasht sobald ich wxWidgets-Applikationen debugge wo noch keinerlei wxString initialisiert wurde. Deshalb ist es ratsam Breakpoints zu setzen nachdem ein wxString deklariert wurde.