2009-11-19 1 views
11

Ho scoperto un modo per rendere php segfault e sono un po 'curioso di sapere cosa sta succedendo. Forse qualcuno può spiegarlo per me?Errore di segmentazione PHP causato da php while loop

[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%  

Come potete vedere, non succede tutte le volte. Caching php?

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

Non riesco a riprodurlo in 5.2.11 ... –

+0

Avete valgrind disponibile? Puoi eseguirlo con valgrind, ad esempio valgrind php -f ./while.php e postare l'output? –

+5

Non riesco a riprodurre l'errore. La mia versione php è uguale alla tua. – erenon

risposta

4

Wikipedia: Segmentation Fault

Un po 'di ricerca indica che alcune estensioni PHP potrebbero non essere bello giocare, o non possono giocare piacevole con l'altro. Può anche dipendere dal server o dalla configurazione del server.

Se si utilizzano sia XDebug che Zend Debugger caricati nello stesso momento, ciò può causare questo.

In un primo momento ho pensato che forse il ciclo while utilizzato con una dichiarazione die() potrebbe essere parte della causa .. Sono curioso di sapere se questo provoca anche un errore di segmentazione:

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

Se non lo potrebbe essere proprio come stai usando mentre muori insieme. Come sapete, mentre (1) {} è un loop infinito ... (il vostro server potrebbe non sapere come allocare memoria per le routine infinite) quindi, a meno che non proviate a causare arresti anomali, di solito è una cattiva pratica.

+0

infatti, sto usando xdebug, non ci ho pensato che .. non ero in grado di ricreare il guasto utilizzando valgrind, ma sono riuscito a ottenere un core dump da solo in esecuzione "php - while.php" http://while1.no/files/core.tgz (dominio di adattamento, non credi?) Proverò il tuo script php successivo :) – Joernsn

+0

Non sono sicuro se la funzione check_fault_function che ho creato fa ciò che bisogno, ma almeno php non riesco a indovinare il numero di iterazioni: http://pastebin.org/56321 Anche questo codice segfaulted, ma solo il 30% del tempo, proprio come il precedente. core: while1.no/files/core2.tgz – Joernsn

+0

se il mio esempio ha anche segfault l'errore si trova nell'istruzione die(), non nel ciclo while.forse sta cercando di non allocare memoria/variabili che non ci sono quando esce? http://bugs.php.net/bug.php?id=40045 descrive come il condizionale "-r" può creare segfaults su die() .. come provare 'php while.php' invece di 'php - f while.php '? –

4

Questo sembra essere correlato a un bug noto nel sorgente PHP. È stato riparato nel trunk PHP e sembra che sia stato distribuito un po 'di tempo attorno alla versione 5.2.11. Vedi here e here per i dettagli.

+0

Ho avuto questo problema con 5.3.14 proprio ora, ed era dovuto a XDebug, come suggerito da @Talvi Watja qui: http://stackoverflow.com/a/1768821/125668 – Structed