© saicle/Shutterstock.com
PHP Magazin
Segmentation Faults erfolgreich debuggen

Der schlimmste aller Fehler ist ...


Auch Softwareentwickler machen Fehler. Wenn sich diese Fehler in einer PHP-Applikation verstecken und auch noch die eigenen sind, hat man beim Beheben quasi einen Heimvorteil. Befinden sich die Fehler in der eigenen Domäne, kann man sie mit Standardwerkzeugen ausbessern. Doch es gibt auch Fehler, die sich weder im eigenen Code noch in der vertrauten Programmiersprache befinden: die Segmentation Faults. Sie verhalten sich nicht wie herkömmliche Bugs und müssen anders behandelt werden. Welche Werkzeuge zur Behebung der Segmentation Faults zur Verfügung stehen, soll folgender Artikel zeigen.

Der Begriff „Segmentation Fault“ ist heute als Bezeichnung für eine Speicherschutzverletzung nicht mehr korrekt, da die meisten Betriebssysteme Paging [1] zur Speicherverwaltung einsetzen. Trotzdem hat sich dieser Begriff erhalten. Eine Speicherschutzverletzung eines Programms liegt dann vor, wenn es versucht, auf eine Speicherregion schreibend zuzugreifen, die entweder schreibgeschützt oder von einem anderen Programm reserviert ist. Weitere häufige Auslöser einer Schutzverletzung sind folgende:

  • Nutzung von uninitialisierten Pointern, die auf keine feste Adresse zeigen

  • Nutzung von Pointern, die auf schon freigegebene Speicherbereiche verweisen

  • ein Hardwaredefekt

Der Kernel löst bei einer Speicherschutzverletzung durch ein Programm ein SIGSEGV-Signal [2] aus und teilt so dem aufrufenden Programm mit, dass es eine Schutzverletzung begangen hat. Das Programm reagiert sofort mit einem Ausführungsstopp und schreibt vorher, falls konfiguriert, noch ein Abbild seines Speicherzustands in einem speziellen Format in ein vorher konfiguriertes Verzeichnis. Dieses Abbild ist der Core Dump [3], der den Speicherzustand des Programms zum Zeitpunkt des Ausführungsstopps beinhaltet.

Bei PHP-Programmen beendet der Interpreter sofort die Programmausführung und zeigt eine Nachricht im konfigurierten Error Log oder an der Kommandozeile an. Vom PHP-Interpreter ausgelöste Segmentation Faults können nicht direkt von einem PHP-Skript stammen. In einer Skriptsprache wie PHP beschreibt das Skript dem Interpreter, welche Funktion er auf der unterliegenden Ebene (bei PHP C-Code) ausführen soll. Die hinter der Beschreibung liegenden Anweisungen werden dann im C-Code auf der Maschine ausgeführt. Ein Segmentation Fault wird daher immer von einer PHP Extension oder dem PHP Core in den unterliegenden C-Funktionen ausgelöst. PHP-Code kann also nicht eigenständig den Segmentation Fault erzeugen. Daher k...

PHP Magazin
Segmentation Faults erfolgreich debuggen

Der schlimmste aller Fehler ist ...

Auch Softwareentwickler machen Fehler. Wenn sich diese Fehler in einer PHP-Applikation verstecken und auch noch die eigenen sind, hat man beim Beheben quasi einen Heimvorteil. Befinden sich die Fehler in der eigenen Domäne, kann man sie mit Standardwerkzeugen ausbessern. Doch es gibt auch Fehler, die sich weder im eigenen Code noch in der vertrauten Programmiersprache befinden: die Segmentation Faults. Sie verhalten sich nicht wie herkömmliche Bugs und müssen anders behandelt werden. Welche Werkzeuge zur Behebung der Segmentation Faults zur Verfügung stehen, soll folgender Artikel zeigen.

Mike Lohmann, Nils Langner


Auch Softwareentwickler machen Fehler. Wenn sich diese Fehler in einer PHP-Applikation verstecken und auch noch die eigenen sind, hat man beim Beheben quasi einen Heimvorteil. Befinden sich die Fehler in der eigenen Domäne, kann man sie mit Standardwerkzeugen ausbessern. Doch es gibt auch Fehler, die sich weder im eigenen Code noch in der vertrauten Programmiersprache befinden: die Segmentation Faults. Sie verhalten sich nicht wie herkömmliche Bugs und müssen anders behandelt werden. Welche Werkzeuge zur Behebung der Segmentation Faults zur Verfügung stehen, soll folgender Artikel zeigen.

Der Begriff „Segmentation Fault“ ist heute als Bezeichnung für eine Speicherschutzverletzung nicht mehr korrekt, da die meisten Betriebssysteme Paging [1] zur Speicherverwaltung einsetzen. Trotzdem hat sich dieser Begriff erhalten. Eine Speicherschutzverletzung eines Programms liegt dann vor, wenn es versucht, auf eine Speicherregion schreibend zuzugreifen, die entweder schreibgeschützt oder von einem anderen Programm reserviert ist. Weitere häufige Auslöser einer Schutzverletzung sind folgende:

  • Nutzung von uninitialisierten Pointern, die auf keine feste Adresse zeigen

  • Nutzung von Pointern, die auf schon freigegebene Speicherbereiche verweisen

  • ein Hardwaredefekt

Der Kernel löst bei einer Speicherschutzverletzung durch ein Programm ein SIGSEGV-Signal [2] aus und teilt so dem aufrufenden Programm mit, dass es eine Schutzverletzung begangen hat. Das Programm reagiert sofort mit einem Ausführungsstopp und schreibt vorher, falls konfiguriert, noch ein Abbild seines Speicherzustands in einem speziellen Format in ein vorher konfiguriertes Verzeichnis. Dieses Abbild ist der Core Dump [3], der den Speicherzustand des Programms zum Zeitpunkt des Ausführungsstopps beinhaltet.

Bei PHP-Programmen beendet der Interpreter sofort die Programmausführung und zeigt eine Nachricht im konfigurierten Error Log oder an der Kommandozeile an. Vom PHP-Interpreter ausgelöste Segmentation Faults können nicht direkt von einem PHP-Skript stammen. In einer Skriptsprache wie PHP beschreibt das Skript dem Interpreter, welche Funktion er auf der unterliegenden Ebene (bei PHP C-Code) ausführen soll. Die hinter der Beschreibung liegenden Anweisungen werden dann im C-Code auf der Maschine ausgeführt. Ein Segmentation Fault wird daher immer von einer PHP Extension oder dem PHP Core in den unterliegenden C-Funktionen ausgelöst. PHP-Code kann also nicht eigenständig den Segmentation Fault erzeugen. Daher k...

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang