“[Thông báo] tín hiệu thoát XXXX con pid Lỗi phân đoạn (11)” trong lỗi apache .log [đã đóng]


100

Tôi đang sử dụng ngăn xếp Apache / PHP / MySQL.
Sử dụng làm khuôn khổ CakePHP.

Thỉnh thoảng tôi nhận được một trang trắng trắng. Tôi không thể gỡ lỗi nó qua Cake, vì vậy tôi xem qua nhật ký lỗi apache và đây là những gì tôi nhận được:

[Wed Oct 12 15:27:23 2011] [notice] child pid 3580 exit signal Segmentation fault (11)
[Wed Oct 12 15:27:34 2011] [notice] child pid 3581 exit signal Segmentation fault (11)
[Wed Oct 12 15:30:52 2011] [notice] child pid 3549 exit signal Segmentation fault (11)
[Wed Oct 12 16:04:27 2011] [notice] child pid 3579 exit signal Segmentation fault (11)
zend_mm_heap corrupted
[Wed Oct 12 16:26:24 2011] [notice] child pid 3625 exit signal Segmentation fault (11)
[Wed Oct 12 17:57:24 2011] [notice] child pid 3577 exit signal Segmentation fault (11)
[Wed Oct 12 17:58:54 2011] [notice] child pid 3550 exit signal Segmentation fault (11)
[Wed Oct 12 17:59:52 2011] [notice] child pid 3578 exit signal Segmentation fault (11)
[Wed Oct 12 18:01:38 2011] [notice] child pid 3683 exit signal Segmentation fault (11)
[Wed Oct 12 22:20:53 2011] [notice] child pid 3778 exit signal Segmentation fault (11)
[Wed Oct 12 22:29:51 2011] [notice] child pid 3777 exit signal Segmentation fault (11)
[Wed Oct 12 22:33:42 2011] [notice] child pid 3774 exit signal Segmentation fault (11)

Lỗi phân đoạn này là gì và tôi có thể sửa nó như thế nào?

CẬP NHẬT:

PHP Version 5.3.4, OSX local development
Server version: Apache/2.2.17 (Unix)
CakePhp: 1.3.10

Cần thêm thông tin về cấu hình, ví dụ: nếu phiên bản php và các mô-đun đã sử dụng đã được cập nhật và nếu bạn sử dụng một số loại bộ đệm hoặc bộ tăng tốc.
CodeCaster

Bạn có thể cho tôi biết bạn cần thông tin gì và cách lấy thông tin để tôi có thể đăng nó được không?
mgPePe

Cũng kiểm tra điều này: stackoverflow.com/questions/15689765/…
trante

Gần đây, tôi đã có rất nhiều thứ trong nhật ký apache của mình, cũng có thể là segfault (11). Lỗi của tôi là do APC gây ra và lỗi đã dừng ngay sau khi tôi tắt APC trong php một lần nữa. Nhưng của bạn có thể có nhiều nguyên nhân khác.
Meetai.com

Câu trả lời:


66

Đính kèm gdb vào một trong các quy trình con httpd và tải lại hoặc tiếp tục hoạt động và đợi sự cố rồi xem dấu vết. Làm điều gì đó như sau:

$ ps -ef|grep httpd
0     681     1   0 10:38pm ??         0:00.45 /Applications/MAMP/Library/bin/httpd -k start
501   690   681   0 10:38pm ??         0:00.02 /Applications/MAMP/Library/bin/httpd -k start

...

Bây giờ đính kèm gdb vào một trong các quy trình con, trong trường hợp này là PID 690 (các cột là UID, PID, PPID, ...)

$ sudo gdb
(gdb) attach 690
Attaching to process 690.
Reading symbols for shared libraries . done
Reading symbols for shared libraries ....................... done
0x9568ce29 in accept$NOCANCEL$UNIX2003 ()
(gdb) c
Continuing.

Chờ cho sự cố ... sau đó:

(gdb) backtrace

Hoặc là

(gdb) backtrace full

Sẽ cung cấp cho bạn một số manh mối những gì đang xảy ra. Nếu bạn gửi một báo cáo lỗi, bạn nên bao gồm dấu vết.

Nếu sự cố khó tái tạo, có thể là một ý tưởng hay để cấu hình Apache để chỉ sử dụng một quy trình con để xử lý các yêu cầu. Cấu hình như thế này:

StartServers 1
MinSpareServers 1
MaxSpareServers 1

1
Tôi vừa gặp phải vấn đề này và có vẻ như khi tôi gắn gdb vào một tiến trình con, tôi không nhận được segfault và apache không bao giờ kết thúc việc hiển thị trang. (Sao chép lại segfault bằng cách khác chỉ là vấn đề nhấn refresh vì nó xảy ra trong mỗi lần tải lại). Đã lâu rồi kể từ khi tôi làm việc với những chiếc móc dao kim loại gần gũi hơn trong những ngày C của tôi. Tôi tự hỏi tại sao nó có thể biểu hiện hành vi này. Nó không tìm thấy nhiều ký hiệu từ bản dựng của tôi, nhưng điều đó sẽ chỉ tạo ra một dấu vết ít thông tin hơn phải không?
lucian303

Hmm thật kỳ lạ. Bạn có thể đảm bảo rằng quá trình mặc định thực sự là quá trình mà bạn được đính kèm gdb không? kiểm tra dmesgpid của quá trình mặc định.
Mattias Wadman

GDB không hoạt động. Mang lại cho tôiUnable to access task for process-id 70: (os/kern) failure.
mgPePe

Đây có phải là OSX không? có thể kiểm tra stackoverflow.com/questions/11504377/…
Mattias Wadman

2
tìm thấy các giải pháp: cuộc gọi set follow-fork-mode childvà sau đó gắn vào quá trình cha mẹ (một mà quá trình bầy con) -> stackoverflow.com/questions/15126925/...
maxgalbu

24

Lỗi phân tách là một lỗi nội bộ trong php (hoặc ít khả năng hơn là apache). Thông thường, lỗi phân đoạn là do một trong những mô-đun php mới hơn và ít được thử nghiệm hơn như imagemagick hoặc subversion.

Thử tắt tất cả các mô-đun không cần thiết (trong php.ini), sau đó bật lại từng mô-đun cho đến khi lỗi xảy ra. Bạn cũng có thể muốn cập nhật php và apache.

Nếu điều đó không hữu ích, bạn nên báo cáo lỗi php .


Nhưng làm thế nào tôi có thể biết nó là cái nào?
mgPePe

Đối với tôi (trên Debian Stretch) nó là module Apache mod-geoip- bây giờ tôi sử dụng geoip-mở rộng php thay vì
Christopher K.

@mgPePe Để biết đó là mô-đun nào, chỉ cần tắt tất cả các mô-đun không thiết yếu (bắt đầu với tất cả các mô-đun được phát triển bên ngoài như mod-geoip). Vấn đề có tiếp tục không? Sau đó, vô hiệu hóa thêm. Không thấy bất kỳ mặc định nào nữa? Bật nhiều mô-đun hơn cho đến khi bạn thực hiện. Nếu bạn thiên về kỹ thuật và có trình gỡ lỗi, hãy xem câu trả lời tuyệt vời của @Mathias Wadmann. Hãy lưu ý rằng trình gỡ lỗi có thể đánh lừa bạn - đôi khi sự cố có thể nằm trong một mô-đun khác.
phihag

18

Bạn đã thử tăng output_buffering trong php.ini của mình chưa?

"Zend_mm_heap bị hỏng" có nghĩa là gì?


4
Tôi đã gặp vấn đề tương tự khi bóp debian với apache / php / mysql sau một số cập nhật. Tôi đặt nó thành output_buffering = 4096và bây giờ các trang hoạt động trở lại. Thx
rubo77

3
Và đối với tôi chỉ output_buffering = 8192hoạt động. Cảm ơn rất nhiều!
Oleg

2
Và bây giờ, trên một trang khác, output_buffering = 8192gây ra segfault, đã được sửa bằng cách thiết lập output_buffering = Off. Tôi bối rối rất nhiều.
Oleg

1
Đó là nhiều năm sau, nhưng đối với bất kỳ ai khác tình cờ gặp phải điều này như tôi đã làm ... Tôi thấy rằng tắt bộ đệm đầu ra cho máy chủ và sau đó thực hiện chỉnh sửa dựa trên thư mục hoặc tệp bằng cách sử dụng tệp htaccess là cách tốt nhất. Bộ đệm đầu ra xác định lượng dữ liệu cần giữ lại trước khi đăng cho người dùng. Với một lớp lót nhỏ, điều này có thể sẽ gây ra lỗi. Trong các tệp lớn hơn, bạn có nguy cơ làm quá tải quy trình.
Giỏ hàng bị bỏ rơi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.