“ [ประกาศ] สัญญาณลูกออก pid XXXX ข้อผิดพลาดในการแบ่งส่วน (11)” ใน apache error.log [closed]


102

ฉันใช้ Apache / PHP / MySQL stack
ใช้เป็นกรอบ CakePHP

ทุกๆครั้งที่ฉันได้รับหน้ากระดาษสีขาวว่างเปล่า ฉันไม่สามารถดีบักผ่าน Cake ได้ดังนั้นฉันจึงมองเข้าไปใน apache error.log และนี่คือสิ่งที่ฉันได้รับ:

[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 และโมดูลที่ใช้เป็นเวอร์ชันล่าสุดและหากคุณใช้แคชหรือตัวเร่งความเร็วบางประเภท
CodeCaster

ช่วยบอกหน่อยได้ไหมว่าต้องการข้อมูลอะไรและจะได้อย่างไรฉันจึงจะโพสต์ได้
mgPePe

ตรวจสอบสิ่งนี้ด้วย: stackoverflow.com/questions/15689765/…
trante

ฉันมีจำนวนมากในบันทึก apache เมื่อเร็ว ๆ นี้เช่นกัน segfault (11) ของฉันเกิดจาก APC และข้อผิดพลาดหยุดลงทันทีที่ฉันปิดใช้งาน APC ใน php อีกครั้ง แต่ของคุณอาจมีสาเหตุอื่น ๆ อีกมากมาย
Meetai.com

คำตอบ:


66

แนบ gdb กับหนึ่งในกระบวนการย่อย httpd และโหลดใหม่หรือทำงานต่อและรอให้เกิดข้อขัดข้องจากนั้นดูที่ backtrace ทำสิ่งนี้:

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

รอให้พัง ... แล้ว:

(gdb) backtrace

หรือ

(gdb) backtrace full

ควรให้เบาะแสว่าเกิดอะไรขึ้น หากคุณยื่นรายงานข้อบกพร่องคุณควรรวม backtrace ไว้ด้วย

หากความผิดพลาดเกิดขึ้นซ้ำได้ยากอาจเป็นความคิดที่ดีที่จะกำหนดค่า Apache ให้ใช้กระบวนการย่อยเดียวในการจัดการคำขอ การกำหนดค่าเป็นดังนี้:

StartServers 1
MinSpareServers 1
MaxSpareServers 1

1
ฉันเพิ่งเจอสิ่งนี้และดูเหมือนว่าเมื่อฉันเชื่อมต่อ gdb กับกระบวนการย่อยแล้วฉันไม่ได้รับ segfault และ apache ก็ไม่เคยแสดงผลหน้าเสร็จ (การทำซ้ำ segfault เป็นอย่างอื่นเป็นเพียงเรื่องของการกดปุ่มรีเฟรชเมื่อเกิดขึ้นทุกครั้งที่โหลดซ้ำ) ผ่านมาสักพักแล้วที่ฉันทำงานใกล้ชิดกับโซ่เครื่องมือโลหะมากขึ้นในช่วง C ของฉัน ฉันสงสัยว่าทำไมมันถึงแสดงพฤติกรรมนี้ มันไม่พบสัญลักษณ์มากมายจากงานสร้างของฉัน แต่นั่นควรจะทำให้เกิด backtrace ที่ให้ข้อมูลน้อยลง?
lucian303

อืมแปลกดี คุณแน่ใจได้หรือไม่ว่ากระบวนการที่ segfaults เป็นกระบวนการที่คุณแนบ gdb มา ตรวจสอบdmesgpid ของกระบวนการ segfaulted
Mattias Wadman

GDB ไม่ทำงาน ให้ฉันUnable to access task for process-id 70: (os/kern) failure.
mgPePe

OSX นี้หรือเปล่า อาจตรวจสอบstackoverflow.com/questions/11504377/…
Mattias Wadman

2
พบวิธีแก้ปัญหา: โทรset follow-fork-mode childแล้วเชื่อมต่อกับกระบวนการหลัก (กระบวนการที่สร้างกระบวนการย่อย) -> stackoverflow.com/questions/15126925/…
maxgalbu

24

ความผิดพลาดในการแบ่งส่วนเป็นข้อผิดพลาดภายในใน php (หรือมีโอกาสน้อยกว่า apache) บ่อยครั้งความผิดพลาดในการแบ่งกลุ่มเกิดจากโมดูล php ที่ใหม่กว่าและทดสอบน้อยกว่าเช่น imagemagick หรือการโค่นล้ม

ลองปิดการใช้งานโมดูลที่ไม่จำเป็นทั้งหมด (ในphp.ini) แล้วเปิดใช้งานใหม่ทีละโมดูลจนกว่าข้อผิดพลาดจะเกิดขึ้น คุณอาจต้องการอัปเดต php และ apache

หากไม่ได้ช่วยให้คุณควรรายงานข้อผิดพลาดมี PHP


แต่ฉันจะรู้ได้อย่างไรว่ามันคืออะไร?
mgPePe

สำหรับฉัน (บน Debian Stretch) มันเป็นโมดูล Apache mod-geoip- ตอนนี้ฉันใช้ php geoip-extension แทน
Christopher K.

@mgPePe หากต้องการทราบว่าเป็นโมดูลใดเพียงปิดใช้งานโมดูลที่ไม่จำเป็นทั้งหมด (เริ่มต้นด้วยโมดูลที่พัฒนาจากภายนอกทั้งหมดเช่นmod-geoip) ปัญหายังคงดำเนินต่อไปหรือไม่? จากนั้นปิดการใช้งานเพิ่มเติม ไม่เห็น segfaults อีกต่อไป? เปิดใช้งานโมดูลเพิ่มเติมจนกว่าคุณจะเสร็จสิ้น หากคุณมีความโน้มเอียงในทางเทคนิคและมีดีบักเกอร์โปรดดูคำตอบที่ยอดเยี่ยมของ @Mathias Wadmann โปรดทราบว่าดีบักเกอร์อาจทำให้คุณเข้าใจผิด - บางครั้งความผิดพลาดอาจอยู่ในโมดูลอื่น
phihag

18

คุณพยายามเพิ่ม output_buffering ใน php.ini ของคุณหรือไม่?

"zend_mm_heap เสียหาย" หมายความว่าอย่างไร


4
ฉันมีปัญหาเดียวกันกับการบีบเดเบียนด้วย apache / php / mysql หลังจากการอัปเดตบางอย่าง ฉันตั้งค่าเป็นoutput_buffering = 4096และตอนนี้หน้าจะทำงานอีกครั้ง Thx
rubo77

3
และสำหรับฉันใช้output_buffering = 8192งานได้เท่านั้น ขอบคุณมาก!
Oleg

2
และตอนนี้ในหน้าอื่นoutput_buffering = 8192ที่ทำให้เกิด segfault output_buffering = Offซึ่งได้รับการแก้ไขโดยการตั้งค่า ฉันสับสนมากมาย
Oleg

1
หลายปีต่อมา แต่สำหรับใครก็ตามที่สะดุดกับสิ่งนี้เหมือนฉัน ... ฉันพบว่าการปิดการบัฟเฟอร์เอาต์พุตสำหรับเซิร์ฟเวอร์แล้วทำการแก้ไขตามไดเรกทอรีหรือไฟล์โดยใช้ไฟล์ htaccess เป็นวิธีที่จะไป บัฟเฟอร์เอาต์พุตจะกำหนดจำนวนข้อมูลที่จะเก็บไว้ก่อนโพสต์ไปยังผู้ใช้ ด้วยหนึ่งไลน์เนอร์ขนาดเล็กอาจทำให้เกิดข้อผิดพลาด ในไฟล์ขนาดใหญ่คุณอาจเสี่ยงต่อการทำงานหนักเกินไป
รถเข็นที่ถูกทิ้ง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.