Fallo de segmentación en PHP

Haciendo un pequeño proyecto en PHP siguiendo el paradigma de la orientación a objetos, hoy me he encontrado con un pequeño problema del que PHP no te avisa.

Bueno, te avisa mostrando la pantalla del navegador totalmente en blanco (no genera ningún HTML) y si lo ejecutas mediante CLI te dice Fallo de segmentación (core dumped). Este es de los errores más bonitos que te pueden ocurrir programando, sobre todo cuando no eres tú el que hizo el software que falló.

Usando un poco el gdb como indican en la documentación de PHP cuando se produce un segfault, he visto que existen varias funciones que siempre se ejecutan en bucle infinito: zend_get_constant_ex(), zval_update_constant_ex() y zval_update_constant().

Como mi aplicación utiliza muchas constantes (no me gusta poner cadenas por el código; cada vez que una cadena se repite la refactorizo a una constante) me dio que pensar y al final (después de bastante rato) descubrí el error. Más o menos, para que lo podáis comprobar, bastaría con ejecutar en Linux el comando php5 -f segfault.php siendo segfault.php el siguiente código:

#!/usr/bin/php5
<?php

class BaseClass {
const THE_CONSTANT = "beosman";
}

class DerivedClass extends BaseClass {
const THE_CONSTANT = self::THE_CONSTANT;
function __construct() {
echo "THE_CONSTANT = ".self::THE_CONSTANT."\n";
}
}

$class = new DerivedClass();

?>

Para más información, estoy usando PHP versión 5.2.1 (Zend Engine v2.2.0) en Ubuntu 7.04 (kernel 2.6.20-17-generic).

Y por si alguien quire fuchicar un rato más porque no se queda agusto, para ejecutar gdb hay que usar el comando gdb php5 y luego, dentro de su propia consola hay que ejecutar el comando run /ruta/al/archivo/php/que/falla.php -e. Una vez que falle, hay que indicarle a gdb que imprima un backtrace mediante el comando bt.

2 personas han comentado en “Fallo de segmentación en PHP”

  1. BeRt dice:

    pues en debian. al menos en CLI te avisa:

    Fatal error: Cannot declare self-referencing constant ‘self::THE_CONSTANT’ in /home/alberto/segfault.php on line 15

    PHP version 5.2.6, asi que supongo que sea que ya está arreglado

  2. Diego dice:

    A ver si viene mi ordenador nuevo, le pongo Ubuntu 8.10 y ese ya traerá el ultimísimo PHP que supongo ya no fallará, como bien apuntas.

    Pero vamos, curioso lo que me ha pasado… sí.

Deja tu comentario:

Puedes usar las etiquetas XHTML <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

?

Please leave these two fields as-is: