Donnerstag, 24. Mai 2012


Artikel

Februar 2012 | Artikel

Segmentation Faults - Der schlimmste aller Fehler ist ... Fortsetzung, Teil 2

Teil 1   Teil 2   Teil 3   Teil 4   Teil 5   Teil 6   Teil 7   Teil 8   

Wie zeigt sich ein Segmentation Fault

Der Segmentation Fault führt immer zu einem sofortigen Abbruch der Programmausführung. Wenn PHP nur auf der Kommandozeile ausgeführt wird, ist sehr einfach zu erkennen, dass ein Segmentation Fault vorliegt. Der Interpreter meldet diesen Fehler einfach über stderr an die Konsole, in der der Segmentation Fault geschrieben wird.

Listing 1: Quelltext von "reproduceSegFault.php"
  1. <?php
  2. class Test implements Serializable
  3. {
  4. public $member, $message;
  5. function __construct($message)
  6. {
  7. $this->message = $message;
  8. }
  9. function serialize()
  10. {
  11. return serialize(array($this->message, $this->member));
  12. }
  13. function unserialize($serialized)
  14. {
  15. list($this->message, $this->member) = unserialize($serialized);
  16. }
  17. }
  18. $constructed = new Test("original");
  19. $constructed->member = $constructed; //References to self (in this example pointless, but technically legal)
  20. var_dump($constructed);
  21. $transported = unserialize(serialize($constructed)); // Segmentation fault.
Listing 2: Ausgabe von "reproduceSegFault.php"
  1. object(Test)#1 (2) {
  2. ["member"]=>
  3. *RECURSION*
  4. ["message"]=>
  5. string(8) "original"
  6. }
  7. Segmentation fault

Etwas schwieriger ist es, mit PHP-Skripten, die über einen Webserver ausgeführt werden, einen Segmentation Fault zu erkennen. Es muss unterschieden werden, ob PHP direkt als Modul des Webservers (z. B. mod_php) oder als Fast-CGI (php-cgi in Debian Squeeze) ausgeführt wird. Bei Verwendung von Nginx und php-cgi und der Anfrage nach reproduceSegFault.php wird einfach eine HTTP-Fehlermeldung ausgegeben: 502 Bad Gateway (Listing 1, der Quelltext ist bei bugs.php.net zu finden [3] und ermöglicht in der Version PHP 5.3.3 das Produzieren eines Segmentation Faults). Dieser Aufruf zeigt, dass der Interpreter die Verarbeitung gestoppt hat und der Nginx-Webserver nicht mehr mit der php-cgi-Instanz kommunizieren kann.

Teil 1   Teil 2   Teil 3   Teil 4   Teil 5   Teil 6   Teil 7   Teil 8   

Kommentare