Lustige Effekte mit gdb

Developer-Tools, Entwicklungsumgebungen und alles andere, was sich installieren lässt
Antworten
Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Lustige Effekte mit gdb

Beitrag von Xin » Mo Apr 18, 2016 9:24 pm

Vielleicht mal als kleines Ratespiel ganz interessant. Denn ich fand die Ausgabe im ersten Moment etwas unerwartet. Darum poste ich es mal hier. Kann sich jemand einen Reim drauf machen?

Die korrekte Ausgabe des Programms ist "4.000000".

Code: Alles auswählen

xin@trinity:~/xsd2/trunk/apps/gsys$ gsys -r method.g 
Speicherzugriffsfehler (Speicherabzug geschrieben)
xin@trinity:~/xsd2/trunk/apps/gsys$ gdb gsys
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
[...Copyright...NO WARRINTY und weitere Texte, die hier nicht helfen...]
Reading symbols from gsys...done.
(gdb) run -r method.g 
Starting program: /home/xin/xsd2/trunk/bin/gsys -r method.g
4.000000
[Inferior 1 (process 7229) exited normally]
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Lustige Effekte mit gdb

Beitrag von mfro » Mo Apr 18, 2016 9:39 pm

Ein "Heisenbug" - guckt man drauf, isser weg.

Da gibt's mehrere Möglichkeiten:
  • das Programm ist nebenläufig und der Debugger verändert das Timing.
  • gdb schaltet die "address randomization" ab (damit Speicheradressen sich nicht von Durchgang zu Durchgang ändern), u.U. zeigt ein "dangling pointer" plötzlich in einen Adressbereich, der keine Speicherschutzverletzung auslöst
  • alles, was "undefined behaviour" ist, kann so etwas bewirken (nicht initialisierte Variablen, beispielsweise). Das Programm läuft dann möglicherweise auch ohne Debugger manchmal durch
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Lustige Effekte mit gdb

Beitrag von Xin » Mo Apr 18, 2016 10:23 pm

mfro hat geschrieben:Ein "Heisenbug" - guckt man drauf, isser weg.

Da gibt's mehrere Möglichkeiten:
  • das Programm ist nebenläufig und der Debugger verändert das Timing.
Das Programm ist nicht nebenläufig.
mfro hat geschrieben:
  • gdb schaltet die "address randomization" ab (damit Speicheradressen sich nicht von Durchgang zu Durchgang ändern), u.U. zeigt ein "dangling pointer" plötzlich in einen Adressbereich, der keine Speicherschutzverletzung auslöst
Tut es. Aber auch mit address randomization läuft es auch wunderbar.
mfro hat geschrieben:
  • alles, was "undefined behaviour" ist, kann so etwas bewirken (nicht initialisierte Variablen, beispielsweise). Das Programm läuft dann möglicherweise auch ohne Debugger manchmal durch
In die Richtung denke ich eher, allerdings wird das ganze langsam doch interessanter.

Das Problem entsteht in allen Zeilen, wo auf ein Char-Array zugegriffen wird:

Code: Alles auswählen

this->Sourcecode[Position]
valgrind meldet an den Stellen "Use of uninitialised value of size 8".
Da denke ich erstmal an char * Sourcecode.

this ist gültig.
Sourcecode ist gültig und initialisiert.
Position wird mit 0 initialisiert.

Alle Zugriffe unter valgrind finden auf die richtige Adresse statt, die Datei wurde wurde zuvor in den Bereich geladen, es wird bei 0 begonnen und arbeitet sich dann durch den Text. Trotzdem gibt es viel Gemecker. Nach einigen hundert Bytes werden die Zugriffe von valgrind nicht weiter kritisiert.

Unter gdb ist Position immer nur im Rahmen von 0 und der Dateigröße und beginnt wie bei Valgrind bei 0.

Startet man das Programm ohne Debugger ist der erste Zugriff auf die korrekte Adresse von Sourcecode, Position ist aber statt 0 viel zu groß, also uninitialisiert. Kurz vor dem Zugriff steht die Ausgabe, die neben der Initialisierung auf 0 steht...

Das ganze lief gestern Abend noch wunderbar... ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Lustige Effekte mit gdb

Beitrag von Xin » Mo Apr 18, 2016 10:41 pm

Fehler gefunden... es war eine nicht initialisierte Variable... allerdings nicht Position. Geht doch nichts über printf-Debugging.
Ich habe Position solange im Programm ausgegeben bis wenige Zeilen vor der Stelle, wo das Programm abschmiert. Und da wurde eine andere Variable drauf addiert. Hatte ich natürlich übersehen m(

Merkwürdig, dass das nie aufgefallen ist, obwohl es tatsächlich ein "Sonderfall" ist, wenn das Programm mit einem einzeiligem Kommentar als erstes Zeichen beginnt. Also eigentlich nicht wirklich ein echter "Sonderfall" ;)
Valgrind gibt nun auch Ruhe - wobei ich nicht verstehe, dass es überhaupt gemeckert hat - hier hat die Variable ja immer gestimmt.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten