2009-11-19 12 views
11

Odkryłem sposób na php segfault, i jestem trochę ciekaw, co się dzieje. Może ktoś może mi to wyjaśnić?Usterka segmentacji PHP spowodowana przez 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%  

Jak widać, nie dzieje się za każdym razem. Buforowanie PHP?

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

Nie mogę tego odtworzyć w dniu 5.2.11 ... –

+0

Czy masz dostęp do valgrind? Czy możesz uruchomić go za pomocą valgrind, np. Valgrind php -f ./while.php i opublikować wyjście? –

+5

Nie mogę odtworzyć błędu. Moja wersja php jest taka sama jak twoja. – erenon

Odpowiedz

4

Wikipedia: Segmentation Fault

Trochę badań wskazuje, że niektóre rozszerzenia PHP nie może grać ładnie, lub nie mogą grać ze sobą miłe. Może również zależeć od serwera lub konfiguracji serwera.

Jeśli używasz jednocześnie XDebug i Zend Debugger, może to spowodować.

Na początku myślałem, ewentualnie pętli while używany z die() oświadczenie może być częścią przyczyny .. Jestem ciekaw, czy powoduje to również błąd segmentacji:

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

Jeśli nie go może być po prostu jak używasz i umrzeć razem. Jak wiesz, podczas gdy (1) {} jest nieskończoną pętlą ... (twój serwer może nie wiedzieć, jak przydzielić pamięć dla nieskończonych procedur), więc jeśli nie próbujesz spowodować awarii, jest to zwykle zła praktyka.

+0

w rzeczywistości, używam xdebug, nie myślałem o tym .. Nie udało mi się odtworzyć usterki za pomocą valgrind, ale udało mi się uzyskać zrzut rdzenia od właśnie działającego "php - while.php" http://while1.no/files/core.tgz (dopasowanie domeny, nie sądzisz?) Spróbuję twojego skryptu php dalej :) – Joernsn

+0

Nie jestem pewien czy funkcja check_fault_function, którą stworzyłem robi to, co ty Potrzebuję, ale przynajmniej php nie potrafię odgadnąć liczby iteracji: http://pastebin.org/56321 Ten kod również się odłączył, ale tylko 30% czasu, tak jak poprzedni. core: while1.no/files/core2.tgz – Joernsn

+0

jeśli mój przykład również segfaulted błąd leży w instrukcji die(), a nie w pętli while.być może próbuje nieprzydzielenia pamięci/zmiennych, których nie ma przy wyjściu? http://bugs.php.net/bug.php?id=40045 opisuje, w jaki sposób warunek "-r" może tworzyć segfaults na matrycy() .. jak o próbie "php while.php" zamiast "php - f while.php "? –

4

Wygląda na to, że jest powiązany ze znanym błędem w źródle PHP. Zostało to naprawione w pniu PHP i wygląda na to, że zostało ono wprowadzone nieco później w wersji 5.2.11. Szczegóły: here i here.

+0

Miałem ten problem z 5.3.14 właśnie teraz, a było to spowodowane XDebug, zgodnie z sugestią @Talvi Watja tutaj: http://stackoverflow.com/a/1768821/125668 – Structed