Apache error.log [kapalı] içinde "[not] çocuk pid XXXX çıkış sinyali Segmentasyon hatası (11)"


102

Apache / PHP / MySQL yığınını kullanıyorum.
CakePHP çerçevesi olarak kullanmak.

Arada sırada boş bir beyaz sayfa alıyorum. Cake ile hata ayıklayamıyorum, bu yüzden apache error.log dosyasına göz atıyorum ve işte şunu elde ediyorum:

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

Bu segmentasyon hatası nedir ve bunu nasıl düzeltebilirim?

GÜNCELLEME:

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

Yapılandırma hakkında daha fazla bilgiye ihtiyacınız var, örneğin php ve kullanılan modüllerin sürümleri güncelse ve bir tür önbelleğe alma veya hızlandırıcı kullanıyorsanız.
CodeCaster

Gönderebilmem için bana hangi bilgilere ihtiyacın olduğunu ve bunları nasıl alacağımı söyler misin?
mgPePe


Son zamanlarda apache günlüklerimde bunlardan birçoğu vardı, segfault da (11). Benimki APC'den kaynaklanıyordu ve php'de APC'yi tekrar devre dışı bıraktığım anda hatalar durdu. Ama seninkinin başka birçok nedeni olabilir.
Meetai.com

Yanıtlar:


66

Gdb'yi httpd çocuk süreçlerinden birine ekleyin ve yeniden yükleyin veya çalışmaya devam edin ve bir çökme için bekleyin ve ardından geri izlemeye bakın. Bunun gibi bir şey yapın:

$ 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

...

Şimdi gdb'yi alt süreçlerden birine ekleyin, bu durumda PID 690 (sütunlar 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.

Kilitlenmeyi bekleyin ... sonra:

(gdb) backtrace

Veya

(gdb) backtrace full

Neler olduğu konusunda sana biraz ipucu vermeliyim. Bir hata raporu verirseniz, geri izlemeyi eklemelisiniz.

Çökmeyi yeniden oluşturmak zorsa, Apache'yi istekleri işlemek için yalnızca bir çocuk süreç kullanacak şekilde yapılandırmak iyi bir fikir olabilir. Yapılandırma şuna benzer:

StartServers 1
MinSpareServers 1
MaxSpareServers 1

1
Bununla yeni karşılaştım ve görünen o ki, bir çocuk sürece gdb eklendiğinde segfault'u alamıyorum ve apache sayfayı işlemeyi hiç bitirmiyor. (Aksi takdirde segfault'u yeniden üretmek, her yeniden yüklemede olduğu gibi yenilemeye basmaktan ibarettir). C günlerimde metal alet zincirlerine daha yakın çalışmayalı epey oldu. Neden bu davranışı sergilediğini merak ediyorum. Yapımdan pek çok sembol bulamadı, ancak bu daha az bilgilendirici bir geri izleme üretmeli, hayır mı?
lucian303

Hmm bu tuhaf. Segfaults'un aslında gdb'ye bağlı olduğunuz işlem olduğundan emin olabilir misiniz? dmesgSegfaulted işlemin kimliğini kontrol edin .
Mattias Wadman

GDB çalışmıyor. Bana verirUnable to access task for process-id 70: (os/kern) failure.
mgPePe


2
çözümü buldu: set follow-fork-mode childana süreci çağırın ve sonra
bağlanın

24

Segmentasyon hatası, php'de (veya daha az olasılıkla apache'de) dahili bir hatadır. Çoğu zaman, bölümleme hatası, imagemagick veya yıkım gibi daha yeni ve daha az test edilmiş php modüllerinden kaynaklanır.

Gerekli olmayan tüm modülleri (giriş php.ini) devre dışı bırakmayı ve ardından hata oluşana kadar bunları tek tek yeniden etkinleştirmeyi deneyin . Ayrıca php ve apache'yi güncellemek isteyebilirsiniz.

Bu yardımcı olmazsa, bir php hatası bildirmelisiniz .


Ama hangisi olduğunu nasıl bilebilirim?
mgPePe

Benim için (Debian Stretch'te) Apache modülüydü mod-geoip- şimdi onun yerine php geoip uzantısını kullanıyorum
Christopher

@mgPePe Hangisi olduğunu bulmak için, gerekli olmayan tüm modülleri devre dışı bırakmanız yeterlidir (örneğin, harici olarak geliştirilmiş olanlarla başlayın mod-geoip). Sorun devam ediyor mu? Ardından daha fazlasını devre dışı bırakın. Artık herhangi bir segment görmüyor musunuz? Siz yapana kadar daha fazla modülü etkinleştirin. Teknik olarak eğilimliyseniz ve bir hata ayıklayıcınız varsa, @Mathias Wadmann'ın mükemmel cevabına bakın. Bir hata ayıklayıcının sizi yanıltabileceğini unutmayın - bazen çökme başka bir modülde olabilir.
phihag

18

Php.ini'nizde output_buffering'i artırmayı denediniz mi?

"Zend_mm_heap bozuk" ne anlama geliyor ?


4
Bazı güncellemelerden sonra apache / php / mysql ile debian sıkıştırmasında da aynı sorunu yaşadım. Ayarladım output_buffering = 4096ve şimdi sayfalar tekrar çalışıyor. Thx
rubo77

3
Ve benim için sadece output_buffering = 8192işe yarıyor. Çok teşekkürler!
Oleg

2
Ve şimdi, başka bir sayfada, output_buffering = 8192ayarlanarak düzeltilen segfault'a neden oluyor output_buffering = Off. Kafam çok karıştı.
Oleg 14

1
Yıllar sonra, ama benim yaptığım gibi buna rastlayan herkes için ... Sunucu için çıktı arabelleğini kapatmanın ve ardından bir htaccess dosyası kullanarak dizin veya dosya tabanlı bir düzenleme yapmanın yolunun olduğunu gördüm. Çıktı tamponlama, kullanıcıya göndermeden önce ne kadar verinin saklanacağını belirler. Küçük tek gömleklerde bu muhtemelen bir hataya neden olacaktır. Daha büyük dosyalarda, süreci aşırı yükleme riskiniz vardır.
Terk Sepeti
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.