Speicherzugriffsverletzung - Richtig debuggen
Verfasst: So Jan 06, 2013 2:34 pm
Hi, ich programmiere seit Jahren ohne IDEs, d.h. nur mit Texteditor und Terminal (in meinem Fall gedit und gnome-terminal unter Linux Ubuntu).
Gerade bei C++ ist mir aufgefallen, dass das Debuggen recht komplex ist - vor allem bei Speicherzugriffsverletzungen. Bisher gehe ich folgendermaßen vor, wenn sich mein Programm an einem NULL-Pointer verschluckt hat:
Liegt die Geschwindigkeitseinbuße an Valgrind? (btw arbeite ich mit SDL und kompiliere natürlich die Debugging-Symbole mit g++ in das Programm rein)
Zusätzlich arbeite ich mit GDB (als GUI "nemiver"). Nur hilft der mir oftmals nicht weiter. Anstatt er mir (mit Nemiver kann ich mir ja den Quellcode ansehen und Haltepunkte setzen) die Stelle liefert (an der die Speicherzugriffsverletzung auftaucht), zeigt er mir nur Assembler-Code (oder etwas derartiges - da bin ich nicht ganz auf der Höhe - sieht in jedem Fall sehr maschinen nah aus) an. Zum Debuggen hilft mir das nicht
Und erstmal gefühlte Tausend Haltepunkte zu setzen, klingt für mich nicht nach effektiver Fehlersuche
Lange Rede - kurzer Sinn: Wie debugge ich richtig?
LG Glocke
Gerade bei C++ ist mir aufgefallen, dass das Debuggen recht komplex ist - vor allem bei Speicherzugriffsverletzungen. Bisher gehe ich folgendermaßen vor, wenn sich mein Programm an einem NULL-Pointer verschluckt hat:
- Mittels Valgrind (genauer verwende ich die GUI "alleyoop") finde ich raus, in welcher Funktion bzw. Methode das Problem auftritt. Damit kenne ich meist auch die Zeilennummer, die verdächtiger Weise in Frage kommt.
- Allerdings ist die Ausgabe von Valgrind für mich nicht immer eindeutig (sorry, dass ich jetzt kein Beispiel parat hab, aber manchmal frag ich mich "Was mag der an der Stelle jetzt nicht?").
- Wenn ich die Stelle noch nicht gefunden habe, setze ich Testausgaben (std::cout << "Foo: " << (foo != NULL) << std::endl;) um herauszufinden, wo der Zeiger (un-)gültig ist. Dabei schaue ich mir auch "übergeordnete" Funktionen / Methoden (damit meine ich solche, die die eigentliche "Problem-Funktion/-Methode" aufrufen und Zugriff auf den Zeiger (Klassenmember, Parameter usw.) haben). Vermutlich ist das erheblich mehr Aufwand als überhaupt notwendig.
Liegt die Geschwindigkeitseinbuße an Valgrind? (btw arbeite ich mit SDL und kompiliere natürlich die Debugging-Symbole mit g++ in das Programm rein)
Zusätzlich arbeite ich mit GDB (als GUI "nemiver"). Nur hilft der mir oftmals nicht weiter. Anstatt er mir (mit Nemiver kann ich mir ja den Quellcode ansehen und Haltepunkte setzen) die Stelle liefert (an der die Speicherzugriffsverletzung auftaucht), zeigt er mir nur Assembler-Code (oder etwas derartiges - da bin ich nicht ganz auf der Höhe - sieht in jedem Fall sehr maschinen nah aus) an. Zum Debuggen hilft mir das nicht

Und erstmal gefühlte Tausend Haltepunkte zu setzen, klingt für mich nicht nach effektiver Fehlersuche

Lange Rede - kurzer Sinn: Wie debugge ich richtig?
LG Glocke