"[Avviso] errore segmentazione segnale di uscita pid XXXX figlio (11)" in apache error.log [chiuso]


100

Sto usando lo stack Apache / PHP / MySQL.
Utilizzando come struttura CakePHP.

Ogni tanto ricevo una pagina bianca vuota. Non riesco a eseguire il debug tramite Cake, quindi do un'occhiata al file error.log di apache ed ecco cosa ottengo:

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

Cos'è questo errore di segmentazione e come posso risolverlo?

AGGIORNARE:

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

Occorrono maggiori informazioni sulla configurazione, ad esempio se le versioni di php e dei moduli utilizzati sono aggiornate e se si utilizza un qualche tipo di cache o acceleratore.
CodeCaster

Puoi dirmi di quali informazioni hai bisogno e come ottenerle, così posso pubblicarle?
mgPePe


Ultimamente ne avevo molti nei miei log di Apache, anche segfault (11). I miei sono stati causati da APC e gli errori si sono interrotti non appena ho disabilitato nuovamente APC in php. Ma i tuoi potrebbero avere molte altre cause.
Meetai.com

Risposte:


66

Collega gdb a uno dei processi secondari httpd e ricarica o continua a lavorare e attendi un arresto anomalo, quindi guarda il backtrace. Fai qualcosa del genere:

$ 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

...

Ora collega gdb a uno dei processi figli, in questo caso PID 690 (le colonne sono 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.

Aspetta il crash ... poi:

(gdb) backtrace

O

(gdb) backtrace full

Dovrebbe darti un'idea di cosa sta succedendo. Se invii una segnalazione di bug dovresti includere il backtrace.

Se il crash è difficile da riprodurre, potrebbe essere una buona idea configurare Apache per utilizzare solo un processo figlio per la gestione delle richieste. La configurazione è qualcosa del genere:

StartServers 1
MinSpareServers 1
MaxSpareServers 1

1
Mi sono appena imbattuto in questo e sembra che quando ho gdb collegato a un processo figlio non ottengo il segfault e apache non finisce mai di rendere la pagina. (Altrimenti riprodurre il segfault è solo questione di premere il refresh come avviene ad ogni ricarica). È passato un po 'di tempo da quando ho lavorato con più vicino alle catene di strumenti in metallo nei miei giorni C. Mi chiedo perché potrebbe mostrare questo comportamento. Non ha trovato molti simboli dalla mia build, ma dovrebbe produrre solo un backtrace meno informativo no?
lucian303

Hmm questo è strano. Potete assicurarvi che il processo che esegue il segfault sia effettivamente quello a cui siete collegati gdb? verificare dmesgil pid del processo segfault.
Mattias Wadman

GDB non funziona. Gives meUnable to access task for process-id 70: (os/kern) failure.
mgPePe

È questo OSX? forse controllare stackoverflow.com/questions/11504377/...
Mattias Wadman

2
trovato la soluzione: chiamata set follow-fork-mode childe quindi connettersi al processo genitore (quello che i processi spawn child) -> stackoverflow.com/questions/15126925/...
maxgalbu

24

Un errore di segmentazione è un errore interno in php (o, meno probabilmente, apache). Spesso, l'errore di segmentazione è causato da uno dei moduli php più recenti e meno testati come imagemagick o subversion.

Prova a disabilitare tutti i moduli non essenziali (in php.ini) e quindi a riabilitarli uno per uno finché non si verifica l'errore. Potresti anche voler aggiornare php e apache.

Se questo non aiuta, dovresti segnalare un bug php .


Ma come faccio a sapere qual è?
mgPePe

Per me (su Debian Stretch) era il modulo Apache mod-geoip- ora uso invece l'estensione php geoip
Christopher K.

@mgPePe Per scoprire qual è, disabilita semplicemente tutti i moduli non essenziali (inizia con tutti quelli sviluppati esternamente come mod-geoip). Il problema persiste? Quindi disabilita di più. Non vedi più alcun segfault? Abilita più moduli finché non lo fai. Se sei tecnicamente incline e hai un debugger, vedi l'eccellente risposta di @Mathias Wadmann. Tieni presente che un debugger può fuorviarti - a volte il crash può essere in un altro modulo.
phihag

18

Hai provato ad aumentare output_buffering nel tuo php.ini?

Cosa significa "zend_mm_heap danneggiato" ?


4
Ho avuto lo stesso problema su Debian squeeze con apache / php / mysql dopo qualche aggiornamento. L'ho impostato su output_buffering = 4096e ora le pagine funzionano di nuovo. Thx
rubo77

3
E per me output_buffering = 8192funziona solo . Molte grazie!
Oleg

2
E ora, in un'altra pagina, output_buffering = 8192causa il segfault, che è stato risolto impostando output_buffering = Off. Sono molto confuso.
Oleg

1
Sono passati anni, ma per chiunque altro si imbattesse in questo come ho fatto io ... Ho scoperto che disattivare il buffering dell'output per il server e quindi effettuare una modifica basata su directory o file utilizzando un file htaccess era la strada da percorrere. Il buffering dell'output determina la quantità di dati da conservare prima di inviarli all'utente. Con piccole battute, questo probabilmente causerà un errore. In file più grandi, rischi di sovraccaricare il processo.
Carrello abbandonato
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.