Segmentation Faults – Der schlimmste aller Fehler ist …
Kommentare

Das Debugging eines Segmentation Faults ist mit einem C-Debugger komfortabler und aussagekräftiger als ein PHP-Debugger, einfache Debug-Ausgaben oder Strace. Im Linux/Unix-Bereich wird der Gnu-Debugger

Das Debugging eines Segmentation Faults ist mit einem C-Debugger komfortabler und aussagekräftiger als ein PHP-Debugger, einfache Debug-Ausgaben oder Strace. Im Linux/Unix-Bereich wird der Gnu-Debugger (gdb) [9] eingesetzt, um Segmentation Faults zu finden. Im Vorgehen wird zwischen der Analyse eines Core Dumps, der automatisch nach dem Auftreten des Fehlers geschrieben wird, und dem direkten Debugging bei der Ausführung der fehlerhaften Applikation unterschieden.

Analyse eines Core Dumps mit gdb

Der Core Dump wird automatisch erzeugt, sobald ein Programm vom Kernel das SIGSEGV-Signal erhält. Allerdings müssen zur Sicherung und zur korrekten Analyse des Core Dumps einige Einstellungen vorgenommen werden. Zuerst muss PHP mit den Debug-Symbolen geladen werden. Die Debug-Symbole erlauben das Nachvollziehen einer Programmausführung. Ohne sie wäre es nicht möglich von einem Aufruf während der Laufzeit des Programms auf den Quellcode zu schließen. Für Ubuntu- und Debian-Linux-Betriebssysteme können die Debug-Symbole für PHP über das Paket php5-dbg [10] mit sudo apt-get install php5-dbg bezogen werden. Leider scheint dieses Paket momentan im Debian Squeeze nicht zu funktionieren. Ein Aufruf von gdb/usr/bin/php5 erzeugt die Ausgabe in Listing 4 und zeigt, dass die Debug-Symbole nicht geladen wurden, da ein Mapping auf die PHP-Quelldateien nicht möglich ist. Daher ist es für den Test notwendig PHP neu zu kompilieren. Für das Ubuntu/Debian Linux ist das mit den Build-Tools möglich. Sobald die PHP5-Quelldateien im Verzeichnis liegen, muss nur noch die debian/rules-Datei angepasst werden. Hier wird einfach –disable-debug mit –enable-debug ausgetauscht, dann wird wie unter [11] beschrieben der Build-Befehl ausgeführt. Die erzeugten Pakete können danach installiert und gegebenenfalls deinstalliert werden. Es ist wichtig, das selbst erzeugte Paket php5-dbg zu installieren. Mit der Option -enable-debug funktioniert die Auswertung dann einwandfrei.

Listing 4: Die Ausgabe von gdb und php

Nicht korrekt geladene Debug-Symbole:

php5# gdb php
(gdb) run /tmp/reproduceSegFault.php
Starting program: /usr/bin/php /tmp/reproduceSegFault.php
[Thread debugging using libthread_db enabled]
object(Test)#1 (2) {
  ["member"]=>
  *RECURSION*
  ["message"]=>
  string(8) "original"
}

Program received signal SIGSEGV, Segmentation fault.
0x00000000007b64e1 in ?? ()

Korrekt geladene Debug-Symbole:

...
Program received signal SIGSEGV, Segmentation fault.
0x00000000007b64e1 in zend_parse_arg_impl (arg_num=Cannot access memory at address 0x7fffff7fefcc
) at /usr/src/php5-5.3.3/Zend/zend_API.c:289
289     {
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -