2009-11-19 27 views
11

Tôi đã phát hiện ra một cách để tạo ra phân đoạn php và tôi hơi tò mò về những gì đang xảy ra. Có lẽ ai đó có thể giải thích điều này cho tôi?Lỗi phân đoạn PHP do php tạo ra trong khi vòng lặp

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

Như bạn thấy, nó không xảy ra mỗi lần. Php caching?

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

Tôi không thể sao chép điều này vào ngày 5.2.11 ... –

+0

Bạn có sẵn valgrind không? Bạn có thể chạy nó thông qua valgrind tức là valgrind php -f ./while.php và đăng đầu ra không? –

+5

Tôi không thể tạo lại lỗi. Phiên bản php của tôi giống như của bạn. – erenon

Trả lời

4

Wikipedia: Segmentation Fault

Một chút nghiên cứu chỉ ra rằng một số phần mở rộng PHP có thể không chơi đẹp, hoặc có thể không chơi đẹp với nhau. Nó cũng có thể phụ thuộc vào máy chủ hoặc cấu hình máy chủ.

Nếu bạn đang sử dụng cả hai XDebug và Zend Debugger nạp cùng một lúc nó có thể gây ra điều này.

Lúc đầu, tôi nghĩ có thể là vòng lặp while sử dụng với một tuyên bố chết() có thể là một phần của nguyên nhân .. Tôi tò mò muốn biết nếu điều này cũng gây ra một lỗi Phân khúc:

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

Nếu không nó có thể chỉ là cách bạn đang sử dụng trong khi và chết cùng nhau. Như bạn biết trong khi (1) {} là một vòng lặp vô hạn ... (máy chủ của bạn có thể không biết cách cấp phát bộ nhớ cho các thường trình vô hạn) vì vậy trừ khi bạn đang cố gắng gây ra sự cố, đây là thực hành không tốt.

+0

trên thực tế, tôi đang sử dụng xdebug, không nghĩ về điều đó .. Tôi không thể tạo lại lỗi bằng cách sử dụng valgrind, nhưng tôi đã quản lý để có được một kết xuất lõi từ chỉ chạy "php - while.php" http://while1.no/files/core.tgz (tên miền phù hợp, bạn có nghĩ vậy không?) Tôi sẽ thử tập lệnh php của bạn tiếp theo :) – Joernsn

+0

Tôi không chắc liệu check_fault_function tôi đã tạo có thực hiện những gì bạn cần, nhưng ít nhất php không thể đoán số lần lặp: http://pastebin.org/56321 Mã này cũng bị phân đoạn, nhưng chỉ 30% thời gian, giống như trước đó. core: while1.no/files/core2.tgz – Joernsn

+0

nếu ví dụ của tôi cũng bị phân tách lỗi nằm trong câu lệnh die(), không phải là vòng lặp while.có thể nó đang cố gắng unallocate bộ nhớ/biến mà không có khi nó thoát? http://bugs.php.net/bug.php?id=40045 mô tả cách "-r" có điều kiện có thể tạo segfaults trên die() .. làm thế nào về cố gắng 'php while.php' thay vì 'php - f while.php '? –

4

Điều này dường như liên quan đến lỗi đã biết trong nguồn PHP. Nó đã được cố định trong thân cây PHP, và có vẻ như nó đã được tung ra một số thời gian xung quanh bản phát hành 5.2.11. Xem herehere để biết chi tiết.

+0

Tôi gặp sự cố này với 5.3.14 vừa rồi và đó là do XDebug, theo đề xuất của @Talvi Watja tại đây: http://stackoverflow.com/a/1768821/125668 – Structed

Các vấn đề liên quan