2009-11-19 14 views
11

Ich entdeckte eine Möglichkeit, PHP-segfault zu machen, und ich bin ein bisschen neugierig, was passiert. Vielleicht kann jemand das für mich erklären?PHP-Segmentierungsfehler durch php while-Schleife verursacht

[email protected]:..com/trunk5/tools/nestedset> cat > while.php 
<?php 
while(1){ 
     die('dd'); 
} 
?> 
^C 
0 [email protected]:..com/trunk5/tools/nestedset> php -f while.php 
ddzsh: segmentation fault php -f while.php 
0 [email protected]:..com/trunk5/tools/nestedset> php -f while.php 
dd%                                             
0 [email protected]:..com/trunk5/tools/nestedset> php -f while.php 
dd%                                             
0 [email protected]:..com/trunk5/tools/nestedset> php -f while.php 
ddzsh: segmentation fault php -f while.php 
0 [email protected]:..com/trunk5/tools/nestedset> php -f while.php 
ddzsh: segmentation fault php -f while.php 
0 [email protected]:..com/trunk5/tools/nestedset> php -f while.php 
dd%                                             
0 [email protected]:..com/trunk5/tools/nestedset> php -f while.php 
dd%  

Wie Sie sehen können, passiert es nicht jedes Mal. PHP-Zwischenspeicherung?

php5 5.2.10.dfsg.1-2ubuntu6.1 
+0

Ich kann dies nicht auf 5.2.11 reproduzieren ... –

+0

Haben Sie valgrind verfügbar? Können Sie es durch Valgrind laufen, d. H. Valgrind php -f./While.php und die Ausgabe veröffentlichen? –

+5

Ich kann den Fehler nicht reproduzieren. Meine PHP-Version ist die gleiche wie deine. – erenon

Antwort

4

Wikipedia: Segmentation Fault

Ein wenig Forschung zeigt, dass einige PHP-Erweiterungen nicht schön spielen können oder nicht miteinander spielen schön. Es kann auch vom Server oder der Serverkonfiguration abhängen.

Wenn Sie sowohl XDebug als auch Zend Debugger gleichzeitig laden, kann dies dazu führen.

Zuerst dachte ich, vielleicht die while-Schleife mit einem Werkzeug() Anweisung könnte ein Teil der Ursache sein .. Ich bin neugierig, ob dies auch eine Segmentierung Fehler verursacht:

while (!$fault) { 
    $fault=check_fault_function(); 
    } 
if ($fault) { die('dd'); } 

Wenn es nicht Vielleicht ist es nur so, wie du es benutzt und gleichzeitig stirbst. Wie Sie wissen, während (1) {} eine Endlosschleife ist ... (Ihr Server kann nicht wissen, wie Sie Speicher für unendliche Routinen zuweisen). Wenn Sie also nicht versuchen, Abstürze zu verursachen, ist dies normalerweise eine schlechte Übung.

+0

in der Tat, ich benutze xdebug, habe nicht daran gedacht .. Ich konnte nicht den Fehler mit Valgrind neu erstellen, aber ich schaffte es, einen Core Dump von nur "php - while.php" http://while1.no/files/core.tgz (passende Domain, meinst du nicht?) Ich werde dein PHP-Skript als nächstes versuchen :) – Joernsn

+0

ich bin nicht sicher, ob die check_fault_function, die ich erstellt habe, was du machst muss, aber zumindest php kann nicht die Anzahl der Iterationen erraten: http://pastebin.org/56321 Dieser Code segfaulted, aber nur 30% der Zeit, genau wie der vorherige. core: while1.no/files/core2.tgz – Joernsn

+0

Wenn mein Beispiel auch segfaulted ist, liegt der Fehler in der Anweisung die Die(), nicht die While-Schleife.möglicherweise versucht es Speicher/Variablen, die nicht vorhanden sind, wenn es beendet wird, zu reservieren? http://bugs.php.net/bug.php?id=40045 beschreibt, wie die "-r" -Kondition kann segfaults auf sterben() erstellen .. wie wäre es mit 'php while.php' anstelle von 'php - f while.php '? –

4

Dies scheint mit einem bekannten Fehler in der PHP-Quelle zusammenhängen. Es wurde im PHP-Stamm behoben, und es sieht so aus, als wäre es irgendwann um die Version 5.2.11 herum ausgerollt worden. Einzelheiten finden Sie unter here und here.

+0

Ich hatte dieses Problem mit 5.3.14 gerade jetzt, und es war wegen XDebug, wie von @Talvi Watja hier vorgeschlagen: http://Stackoverflow.com/a/1768821/125668 – Structed

Verwandte Themen