"[Pemberitahuan] anak pid XXXX keluar sinyal Segmentasi kesalahan (11)" di apache error.log [ditutup]

100

Saya menggunakan stack Apache / PHP / MySQL.
Menggunakan sebagai framework CakePHP.

Sesekali saya mendapatkan halaman putih kosong. Saya tidak bisa men-debugnya melalui Cake, jadi saya mengintip di apache error.log dan inilah yang saya dapatkan:

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

Apa kesalahan segmentasi ini, dan bagaimana cara memperbaikinya?

MEMPERBARUI:

PHP Version 5.3.4, OSX local development
Server version: Apache/2.2.17 (Unix)
CakePhp: 1.3.10
mgPePe
sumber
Perlu info lebih lanjut tentang konfigurasi, misalnya jika versi php dan modul yang digunakan adalah yang terbaru dan jika Anda menggunakan beberapa jenis caching atau akselerator.
CodeCaster
Bisakah Anda memberi tahu saya info apa yang Anda perlukan dan cara mendapatkannya, agar saya dapat mempostingnya?
mgPePe
Juga periksa ini: stackoverflow.com/questions/15689765/…
trante
Saya memiliki banyak hal di log apache saya akhir-akhir ini, juga segfault (11). Milik saya disebabkan oleh APC dan kesalahan berhenti segera setelah saya menonaktifkan APC di php lagi. Tetapi penyebab Anda bisa disebabkan oleh banyak hal lainnya.
Meetai.com

Jawaban:

66

Lampirkan gdb ke salah satu proses anak httpd dan muat ulang atau lanjutkan bekerja dan tunggu kerusakan lalu lihat lacak balik. Lakukan sesuatu seperti ini:

$ 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

...

Sekarang lampirkan gdb ke salah satu proses anak, dalam hal ini PID 690 (kolom adalah 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.

Tunggu crash ... lalu:

(gdb) backtrace

Atau

(gdb) backtrace full

Harus memberi Anda petunjuk apa yang terjadi. Jika Anda mengajukan laporan bug, Anda harus menyertakan backtrace.

Jika crash sulit untuk direproduksi, mungkin ide yang baik untuk mengkonfigurasi Apache agar hanya menggunakan satu proses anak untuk menangani permintaan. Config-nya adalah seperti ini:

StartServers 1
MinSpareServers 1
MaxSpareServers 1
Mattias Wadman
sumber
1
Saya baru saja mengalami ini dan tampaknya ketika saya memiliki gdb yang dilampirkan ke proses anak, saya tidak mendapatkan segfault dan apache tidak pernah selesai merender halaman. (Mereproduksi segfault jika tidak hanya masalah menekan refresh seperti yang terjadi pada setiap reload). Sudah cukup lama sejak saya bekerja dengan lebih dekat dengan rantai alat logam di hari-hari C saya. Saya bertanya-tanya mengapa mungkin menunjukkan perilaku ini. Itu tidak menemukan banyak simbol dari build saya, tetapi itu seharusnya menghasilkan backtrace yang kurang informatif bukan?
lucian303
Hmm itu aneh. Dapatkah Anda memastikan bahwa proses yang benar-benar segfaults pada Anda terpasang gdb? periksa dmesgpid dari proses segfault.
Mattias Wadman
GDB tidak berfungsi. Memberi sayaUnable to access task for process-id 70: (os/kern) failure.
mgPePe
Apakah OSX ini? mungkin periksa stackoverflow.com/questions/11504377/…
Mattias Wadman
2
menemukan solusinya: panggil set follow-fork-mode childdan kemudian lampirkan ke proses induk (yang memunculkan proses anak) -> stackoverflow.com/questions/15126925/…
maxgalbu
24

Kesalahan segementasi adalah kesalahan internal di php (atau, kemungkinan kecil, apache). Seringkali, kesalahan segmentasi disebabkan oleh salah satu modul php yang lebih baru dan kurang teruji seperti imagemagick atau subversion.

Coba nonaktifkan semua modul yang tidak penting (dalam format php.ini ), lalu aktifkan kembali satu per satu hingga kesalahan terjadi. Anda mungkin juga ingin memperbarui php dan apache.

Jika itu tidak membantu, Anda harus melaporkan bug php .

phihag
sumber
Tapi bagaimana saya bisa tahu yang mana?
mgPePe
Bagi saya (di Debian Stretch) itu adalah modul Apache mod-geoip- saya sekarang menggunakan ekstensi geoip php sebagai gantinya
Christopher K.
@mgPePe Untuk mengetahui yang mana, cukup nonaktifkan semua modul yang tidak penting (mulai dengan semua yang dikembangkan secara eksternal seperti mod-geoip). Apakah masalahnya terus berlanjut? Kemudian nonaktifkan lagi. Tidak melihat segfault lagi? Aktifkan lebih banyak modul sampai Anda melakukannya. Jika Anda secara teknis cenderung dan memiliki debugger, lihat jawaban bagus @Mathias Wadmann. Ketahuilah bahwa debugger dapat menyesatkan Anda - terkadang error dapat terjadi di modul lain.
phihag
18

Sudahkah Anda mencoba meningkatkan output_buffering di php.ini Anda?

Apa artinya "zend_mm_heap corrupt" ?

Wayne
sumber
4
Saya memiliki masalah yang sama pada pemerasan debian dengan apache / php / mysql setelah beberapa pembaruan. Saya mengaturnya ke output_buffering = 4096dan sekarang halaman berfungsi lagi. Thx
rubo77
3
Dan bagi saya hanya output_buffering = 8192bekerja. Terima kasih banyak!
Oleg
2
Dan sekarang, di halaman lain, output_buffering = 8192menyebabkan segfault, yang telah diperbaiki dengan pengaturan output_buffering = Off. Saya sangat bingung.
Oleg
1
Bertahun-tahun kemudian, tetapi bagi siapa pun yang tersandung pada hal ini seperti yang saya lakukan ... Saya menemukan bahwa mematikan buffering keluaran untuk server dan kemudian membuat pengeditan berbasis direktori atau file menggunakan file htaccess adalah cara yang tepat. Buffering keluaran menentukan berapa banyak data yang harus disimpan sebelum dikirim ke pengguna. Dengan satu baris kecil, ini kemungkinan besar akan menyebabkan kesalahan. Dalam file yang lebih besar, Anda berisiko membebani proses secara berlebihan.
Keranjang Terbengkalai