it-swarm.it

Rintracciare gli errori di segmentazione in PHP?

Sto cercando un modo relativamente indolore per rintracciare gli errori di segmentazione in PHP (come riportato nel registro degli errori di Apache). Questa è la mia configurazione della LAMPADA al momento:

Linux: OpenSUSE 11.3 x86_64
Apache: 2.2.15-3.7
MySQL: 5.1.46-2.18
PHP: 5.3.2-1.31

Il codice in questione non è il mio, è Gallery2: http://gallery.menalto.com Uno scenario tipico è che vado alla pagina principale della galleria e nessuna delle anteprime appare ma ottengo un nuovo set di errori di segmentazione nel registro errori.

Data la relativa complessità di quel software, non è particolarmente adatto a forme semplici di debug. Mi piacerebbe essere in grado di scorrere il codice e vedere esattamente cosa sta succedendo. Le "soluzioni" che ho visto finora per farlo sono state piuttosto lontane dall'essere "relativamente indolore".

Ho usato con successo Gallery2 su questo server (versioni precedenti dei pacchetti software LAMP) e su altri server, quindi presumo che ci sia qualcosa di difettoso nella mia configurazione attuale, ma senza essere in grado di vedere dove si verifica l'errore, non posso risolvere o aggirare.

3
S. W.

Posso suggerire di guardare http://sourceforge.net/tracker/index.php?func=detail&aid=1692166&group_id=7130&atid=1071 e http://gallery.menalto.com/ node/62436 # comment-22857 ?

Sembrano esserci problemi comuni con l'utilizzo di Apache_setenv o la compressione dell'URL due volte (a seconda dello scenario - il primo sembra più probabile con le anteprime non visualizzate):

Credo che il problema sia che mod_deflate tenta di decomprimere i dati una seconda volta in base all'URL, il che si traduce in rotture su alcuni sistemi. Dire in questo caso di non decomprimere i file che stiamo inviando aiuta.


Potrebbe esserci un bug in PHP. Prova ad aggiungere $gallery->setConfig('apacheSetenvBroken', 1); al tuo config.php per disabilitare usando la funzione Apache_setenv ()

Apprezzo questa non è la risposta alla domanda che stai ponendo (oltre all'utilizzo di Zend Framework con plugin o riga di comando php e gdb Non so come eseguire il debug dei segfault in PHP) ma può essere d'aiuto.

2
Metalshark

Per eseguire il debug di PHP segfaults normalmente creerai un nuovo file .php (in modo che non interferisca con il tuo codice principale) in questo modo (chiamandolo my_first_debugger.php):

<?php
include('annoying_caller_page_that_crashes.php');
?>

Quindi eseguire gdb php. Se gdb non è installato o i binari gdb/php non sono nel tuo percorso ci saranno errori, quindi usa YaST2 per installare tutto il necessario (ottieni anche le librerie di sviluppo/debug per php dato che di solito includono simboli di debug).

Otterrai un output come:

GNU gdb x.x
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
(gdb) 

Quindi esegui un run my_first_debugger.php nella riga di comando.

Cerca i pacchetti -dev e -dbg se ci sono messaggi come (no debugging symbols found) o potresti non vedere il nome della funzione chiamata.

0
Metalshark