अपाचे एरर.लॉग [बंद] में [नोटिस] चाइल्ड पीआईडी ​​XXXX एग्जिट सिग्नल सेगमेंटेशन फॉल्ट (11) "।


100

मैं अपाचे / PHP / MySQL स्टैक का उपयोग कर रहा हूं।
के रूप में उपयोग करना CakePHP।

हर अब और फिर मुझे एक खाली सफेद पृष्ठ मिलता है। मैं इसे केक के माध्यम से डिबग नहीं कर सकता, इसलिए मैं अपाचे एरर में झांकता हूं। मुझे यहां क्या मिलेगा:

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

यह विभाजन दोष क्या है, और मैं इसे कैसे ठीक कर सकता हूं?

अपडेट करें:

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

कॉन्फ़िगरेशन पर अधिक जानकारी की आवश्यकता है, उदाहरण के लिए अगर php और उपयोग किए गए मॉड्यूल के संस्करण अद्यतित हैं और यदि आप किसी प्रकार के कैशिंग या एक्सेलेरेटर का उपयोग करते हैं।
कोडकस्टर

क्या आप मुझे बता सकते हैं कि आपको क्या जानकारी चाहिए और इसे कैसे प्राप्त करना है, इसलिए मैं इसे पोस्ट कर सकता हूं?
mgPePe

इसे भी देखें: stackoverflow.com/questions/15689765/…
trante

मैं अपने अपाचे लॉग में उन लोगों के एक बहुत हाल ही में भी segfault (11) था। मेरा APC के कारण हुआ और त्रुटियों को बंद कर दिया जैसे ही मैंने APC को फिर से php में अक्षम किया। लेकिन आपके कई अन्य कारण हो सकते हैं।
मीताई.कॉम

जवाबों:


66

Httpd चाइल्ड प्रोसेस में से किसी एक में gdb अटैच करें और काम करना जारी रखें या क्रैश की प्रतीक्षा करें और फिर बैकट्रेस देखें। कुछ इस तरह से करें:

$ 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

...

अब एक बच्चे की प्रक्रिया में gdb संलग्न करें, इस मामले में PID 690 (कॉलम UID, PID, PPV, ...) हैं

$ 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.

दुर्घटना की प्रतीक्षा करें ... फिर:

(gdb) backtrace

या

(gdb) backtrace full

आपको कुछ सुराग देना चाहिए कि क्या चल रहा है। यदि आप बग रिपोर्ट दर्ज करते हैं तो आपको बैकट्रेस को शामिल करना चाहिए।

यदि दुर्घटना को पुन: उत्पन्न करना कठिन है, तो अपाचे को कॉन्फ़िगर करने के लिए अनुरोधों को संभालने के लिए केवल एक बच्चे की प्रक्रियाओं का उपयोग करना एक अच्छा विचार हो सकता है। विन्यास कुछ इस प्रकार है:

StartServers 1
MinSpareServers 1
MaxSpareServers 1

1
मैंने अभी इसमें भाग लिया है और ऐसा लगता है कि जब मैंने gdb को एक बच्चे की प्रक्रिया से जोड़ा है तो मुझे सेगफॉल्ट नहीं मिलता है और अपाचे कभी भी पेज को रेंडर नहीं कर पाता है। (Segfault को फिर से प्रस्तुत करना अन्यथा ताज़ा मारने की बात है क्योंकि यह हर पुनः लोड पर होता है)। जब से मैंने अपने C दिनों में मेटल टूलचिन्स के साथ काम किया है, तब से थोड़ी देर हो गई है। मुझे आश्चर्य है कि यह इस व्यवहार का प्रदर्शन क्यों हो सकता है। यह मेरे निर्माण से बहुत सारे प्रतीक नहीं मिला, लेकिन यह सिर्फ एक कम जानकारीपूर्ण backtrace नहीं का उत्पादन करना चाहिए?
18

हम्म अजीब बात है। क्या आप यह सुनिश्चित कर सकते हैं कि जो प्रक्रिया वास्तव में segfaults पर है वह आप पर gdb संलग्न है? dmesgsegfaulted प्रक्रिया के pid के लिए जाँच करें ।
मैटियास वाडमैन

जीडीबी काम नहीं करता है। मुझे देता हैUnable to access task for process-id 70: (os/kern) failure.
mgPePe

क्या यह OSX है? हो सकता है कि stackoverflow.com/questions/11504377/…
मैटियास वाडमैन

2
समाधान मिला: कॉल करें set follow-fork-mode childऔर फिर पैरेंट प्रोसेस (वह जो बच्चे की प्रक्रियाओं को जन्म देती है) को संलग्न करें -> stackoverflow.com/questions/15126925/…
मैक्सगल्ब

24

सेगमेंटेशन फॉल्ट php (या, कम संभावना, अपाचे) में एक आंतरिक त्रुटि है। अक्सर, विभाजन दोष नए या कम परीक्षण किए गए php मॉड्यूल जैसे कि इमेजमैगिक या सबड्रोवर्जन के कारण होता है।

सभी गैर-आवश्यक मॉड्यूल (में php.ini) को अक्षम करने का प्रयास करें , और फिर त्रुटि होने तक उन्हें एक-एक करके फिर से सक्षम करें। आप php और अपाचे को भी अपडेट करना चाह सकते हैं।

यदि वह मदद नहीं करता है, तो आपको एक php बग की रिपोर्ट करनी चाहिए ।


लेकिन मैं कैसे जान सकता था कि यह कौन सा है?
mgPePe

मेरे लिए (डेबियन स्ट्रेच पर) यह अपाचे मॉड्यूल था mod-geoip- मैं अब इसके बजाय php जियोइप-एक्सटेंशन का उपयोग करता हूं
क्रिस्टोफर के।

@mgPePe यह पता लगाने के लिए कि यह कौन सा है, बस सभी गैर-आवश्यक मॉड्यूल को अक्षम करें (जैसे सभी बाहरी रूप से विकसित लोगों के साथ शुरू करें mod-geoip)। क्या समस्या बनी रहती है? फिर अधिक अक्षम करें। अब किसी भी segfaults नहीं देखें? जब तक आप अधिक मॉड्यूल सक्षम न करें। यदि आप तकनीकी रूप से इच्छुक हैं और एक डिबगर है, तो @ मैथियास वाडमैन का उत्कृष्ट उत्तर देखें। ध्यान रखें कि एक डिबगर आपको गुमराह कर सकता है - कभी-कभी दुर्घटना दूसरे मॉड्यूल में हो सकती है।
फ़िहाग

18

क्या आपने अपने php.ini में output_buffering बढ़ाने की कोशिश की है?

"Zend_mm_heap दूषित" का क्या अर्थ है ?


4
मैं कुछ अद्यतन के बाद अपाचे / php / mysql के साथ डेबियन निचोड़ पर एक ही समस्या थी। मैंने इसे सेट किया output_buffering = 4096और अब पृष्ठ फिर से काम करते हैं। Thx
rubo77

3
और मेरे लिए केवल output_buffering = 8192काम करता है। आपका बहुत बहुत धन्यवाद!
ओलेग

2
और अब, दूसरे पृष्ठ पर, output_buffering = 8192segfault का कारण बनता है, जो सेटिंग द्वारा तय किया गया था output_buffering = Off। मैं बहुत उलझन में हूं।
ओलेग

1
यह वर्षों बाद है, लेकिन किसी और के लिए जो इस तरह से ठोकर खाता है जैसे मैंने किया ... मैंने पाया कि सर्वर के लिए आउटपुट बफ़रिंग को चालू करना और फिर एक htaccess फ़ाइल का उपयोग करके एक निर्देशिका- या फ़ाइल-आधारित संपादन करना रास्ता था। आउटपुट बफ़रिंग निर्धारित करता है कि उपयोगकर्ता को पोस्ट करने से पहले कितना डेटा रखना है। छोटे वन-लाइनर्स के साथ, यह एक त्रुटि का कारण होगा। बड़ी फ़ाइलों में, आप प्रक्रिया को ओवरलोड करने का जोखिम उठाते हैं।
कार्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.