LinuxWiki > LinuxProgrammierung > SegmentationFault

Segmentation Faults

Ja, auch Linux-Programme verabschieden sich von Zeit zu Zeit. Das, was bei Dir als Segmentation Fault zurückkommt, ist im Grunde programmiertechnisch nichts anderes als was unter Windows eine Allgemeine Schutzverletzung ist: Ein Programm will auf Speicher zugreifen, der ihm nicht zugeteilt wurde; meist durch wildgewordene Pointer. Der Unterschied besteht nur in folgenden Dingen:

Natürlich muß der Fehler reproduzierbar sein, sonst macht das alles keinen Sinn. Also, du gehst folgendermaßen vor:

(Nebenbei: Diese Methode ist AUCH für ganz normale Anwender interessant und durchführbar, man kann nichts kaputtmachen!)

Noch einmal: Dies macht NUR Sinn, wenn der Fehler reproduzierbar ist. Starte das betreffende Programm noch einmal, so:

      $ gdb /usr/bin/meinprogramm

Du siehst so etwas (Ausgaben in [Klammern] können abweichen):

       GNU gdb [4.17]
       Copyright [1998] Free Software Foundation, Inc.
       GDB is free software, covered by the GNU General Public License, and you
       are welcome to change it and/or distribute copies of it under certain
       conditions.
       Type "show copying" to see the conditions.
       There is absolutely no warranty for GDB.  Type "show warranty" for
       details.
       This GDB was configured as "[myproc-mydist-linux]"...
       (gdb)

Das Programm läuft jetzt unter der Kontrolle des Debuggers. Es wird nun gestartet:

      (gdb) run
      Starting program: [/path/to/prog/myapp]

Das Programm wird jetzt ganz normal laufen. Wenn es ein X11 Programm ist, werden Fenster usw. dargestellt. Deine Aufgabe ist es jetzt, den Fehler zu provozieren. Wenn das Programm dann abgestürzt ist, mache das X Fenster NICHT zu! Du siehst im gdb Fenster:

      Program recieved signal SIGSEGV, Segmentation fault.
      0x[804858b] in [main] ()
      (gdb)

Die Addressen können etwas anders aussehen, das ist unwichtig. Diese Speicheraddressen (im Gegensatz zu den Windows-Fehlermeldungen) sind aber für den Programmierer unheimlich wertvoll, weil er jetzt genau weiß wo sein Programm ins Nirvana geritten ist. Wir wollen jetzt die Zeit etwas zurückdrehen und gucken, was kurz vor dem Absturz passiert ist:

      (gdb) backtrace 10

Es erscheint so etwas:

       #0  0x[804854f] in [segfault] ()
       #1  0x[8048648] in [deep_12] ()
       #2  0x[8048634] in [deep_11] ()
       #3  0x[8048620] in [deep_10] ()
       #4  0x[804860c] in [deep_9] ()
       #5  0x[80485f8] in [deep_8] ()
       #6  0x[80485e4] in [deep_7] ()
       #7  0x[80485d0] in [deep_6] ()
       #8  0x[80485bc] in [deep_5] ()
       #9  0x[80485a8] in [deep_4] ()
       ...
       (gdb)

Dies ist der saftige Teil, diese Ausgaben mußt Du, zusammen mit einer genauen Beschreibung, was du gemacht hast, an den Programmierer schicken. (Beispiel unten.) Jetzt würgen wir das Programm sauber ab:

      (gdb) kill
      Kill the program being debugged? (y or n) y
      (gdb) quit
      $

Jetzt jage deinen Maileditor hoch und schreibe einen hübschen Bugreport (Beispiel von `kMail', no offence intended):

      To: real@hacker.org
      From: joe_smith@somewhere.com
      Re: kMail crashes whenever I click on the send button

      KMail has been crashing on me whenever I click the send button. I
      followed the beautifully written gdb ultra-mini-guide and got this:

      #0  0x40085658 in free ()
      #1  0x400969b8 in __shtab ()
      #2  0x40096902 in QButtonPress ()
      #3  0x40100aa3 in KDoThatButtonThang ()
      #4  0x402a4b44 in KMail_crash_that_proggie ()
      #5  0x40300ff3 in main ()

      Is there a buffer gone wrong or something?

      Thank you, Joe Linux User

Das wars schon. So etwas ist viiiiel nützlicher, sinnvoller und einfacher für den Programmierer als just die Meldung "Dein Programm stürzt ständig ab".

Du schuldest dem Orakel einen gdb für Windows. ;-)