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 kann ein Fehler auch nicht direkt mit PHP-Werkzeugen gefunden, allerdings auf der PHP-Skript-Ebene unter Nutzung verschiedener Techniken eingegrenzt und gegebenenfalls über Workarounds vermieden werden. Die Fehlerbehebung ist dann aber nur innerhalb der C-Funktionen möglich. Das bedeutet, dass PHP oder seine Extension neu kompiliert werden muss.




