it-swarm-es.com

Rastrear fallas de segmentación en PHP?

Estoy buscando una forma relativamente indolora de rastrear fallas de segmentación en PHP (como se informa en el registro de errores de Apache). Esta es mi configuración de LAMP en este 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

El código en cuestión no es mío, es Gallery2: http://gallery.menalto.com Un escenario típico es que voy a la página principal de la galería y no aparece ninguna de las miniaturas, pero aparece Un nuevo conjunto de errores de segmentación en el registro de errores.

Dada la relativa complejidad de ese software, no es particularmente adecuado para formas simples de depuración. Me gustaría poder recorrer el código y ver exactamente lo que está sucediendo. Las "soluciones" que he visto hasta ahora para hacer esto han estado muy lejos de ser "relativamente indoloras".

He utilizado con éxito Gallery2 en este servidor (versiones anteriores de los paquetes de software LAMP) y en otros servidores, por lo que supongo que hay algo defectuoso en mi configuración actual, pero sin poder ver dónde está ocurriendo la falla, no puedo arreglarlo o solucionarlo.

3
S. W.

¿Puedo sugerir mirar http://sourceforge.net/tracker/index.php?func=detail&aid=1692166&group_id=7130&atid=1071 y http://gallery.menalto.com/ nodo/62436 # comentario-22857 ?

Parece que hay problemas comunes al usar Apache_setenv o al comprimir la URL dos veces (dependiendo del escenario; el primero parece más probable con las miniaturas que no aparecen):

Creo que el problema es que mod_deflate intenta descomprimir los datos por segunda vez en función de la URL, lo que da como resultado roturas en algunos sistemas. Decirle que no comprima los archivos que estamos enviando ayuda en este caso.


Puede haber un error en PHP. Intente agregar $gallery->setConfig('apacheSetenvBroken', 1); a su config.php para deshabilitar el uso de la función Apache_setenv ()

Aprecio que esta no es la respuesta a la pregunta que está haciendo (más allá de usar Zend Framework con complementos o línea de comando php y gdb, no sé cómo depurar segfaults en PHP) pero puede ayudar.

2
Metalshark

Para depurar PHP segfaults normalmente creará un nuevo archivo .php (para que no interfiera con su código principal) así (llamándolo my_first_debugger.php):

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

Luego ejecute gdb php. Si gdb no está instalado o los binarios gdb/php no están en su camino, habrá errores, así que use YaST2 para instalar todo lo necesario (obtenga también las bibliotecas de desarrollo/depuración para php, ya que generalmente incluyen símbolos de depuración).

Obtendrá resultados como:

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) 

Luego solo haga un run my_first_debugger.php en la línea de comando.

Busque los paquetes -dev y -dbg si hay mensajes como (no debugging symbols found) o puede que no vea el nombre de la función que se está llamando.

0
Metalshark