2011-12-17 15 views
8

¿Por qué el siguiente código causa un error de segmentación?Error de segmentación en PHP?

<?php 

$CNX = new mysqli('localhost','dbuser', 'dbpass', 'dbtest'); 

class DAO 
{ 
     var $stmt; 

     function DAO() 
     { 
       $this->stmt = $GLOBALS['CNX']->stmt_init(); 
     } 

     function listing() 
     { 
       $this->stmt->prepare('SELECT * FROM any_table'); 
     } 
} 

class Page 
{ 
     function go() 
     { 
       $d1 = new DAO(); 
       $d2 = new DAO(); 
       $d1->listing(); 
       exit; 
     } 
} 

$tpl = new Page(); 
$tpl->go(); 
?> 

Notas adicionales

1) me encontré este código en dos servidores diferentes de LAMP y ambos generan errores como child pid somenumber exit signal Segmentation fault (11) en mis archivos error.log. En un servidor, ejecuto Ubuntu 10.04, Apache 2, Mysql 5 y PHP 5.3.2-1ubuntu4.9, y en otro servidor ejecuto Ubuntu 11.10, Apache 2, mysql 5 y PHP 5.3.6-13ubuntu3.3 .

2) Es extraño, pero cuando comento la línea $d2 = new DAO(); o la línea exit;, la falla de segmentación desaparece.

3) El fallo de segmentación ocurre sin importar qué tabla db selecciono a partir de la declaración preparada

¿Qué está pasando? Estoy tan frustrado. Perdí el valor de un día entero debido a esta falla de segmentación. Por favor ... si alguien sabe lo que está pasando, que me haga saber

Gracias

+3

El mejor que puede hacer es dejar caer Smarty por completo. Es innecesario sobrecarga. * "¡Oye, agreguemos un motor de plantillas sobre PHP, que es un motor de plantillas!" * ': Rolleyes:' – NullUserException

+0

El código que estás viendo arriba es solo una versión destilada de un problema que existe en 5 años viejo software. Así que no puedo abandonar inteligentemente sin reescribir cientos de páginas de código. – John

+1

Es solo una prueba, pero en el constructor, ¿puede importar primero la variable global y asignarla a una local antes de usarla? Tal vez el segfault desaparezca. Es solo una idea, entonces no hay garantía. – hakre

Respuesta

6

se parece ha encontrado un fallo en el módulo mysqli!

enviarlo a https://bugs.php.net/

No espere que su fijación mañana, sin embargo. Encuentre una forma de evitar el error o intente usar diferentes versiones de PHP/mysqli para ver si puede salir adelante.

Como referencia, puedo reproducirlo también, y aquí hay una traza inversa. Parece que las cosas están explotando al intentar cerrar la conexión y cosas LIMPIEZA: xdebugger

[email protected]:~/tmp$ gdb `which php` 
... 
Reading symbols from /usr/bin/php...(no debugging symbols found)...done. 
(gdb) run tmp.php 
Starting program: /usr/bin/php tmp.php 
[Thread debugging using libthread_db enabled] 
[New Thread 0x7ffff3cb7700 (LWP 1028)] 
[Thread 0x7ffff3cb7700 (LWP 1028) exited] 

Program received signal SIGSEGV, Segmentation fault. 
0x00007ffff458ca25 in vio_peer_addr() from /usr/lib/libmysqlclient_r.so.16 
(gdb) bt 
#0 0x00007ffff458ca25 in vio_peer_addr() from /usr/lib/libmysqlclient_r.so.16 
#1 0x00007ffff458d873 in net_real_write() from /usr/lib/libmysqlclient_r.so.16 
#2 0x00007ffff458dd5b in net_flush() from /usr/lib/libmysqlclient_r.so.16 
#3 0x00007ffff458df40 in net_write_command() from /usr/lib/libmysqlclient_r.so.16 
#4 0x00007ffff458aa84 in cli_advanced_command() from /usr/lib/libmysqlclient_r.so.16 
#5 0x00007ffff455c23c in mysql_stmt_close() from /usr/lib/libmysqlclient_r.so.16 
#6 0x00007ffff42f3815 in ??() from /usr/lib/php5/20090626/mysqli.so 
#7 0x00007ffff42f38ca in ??() from /usr/lib/php5/20090626/mysqli.so 
#8 0x00000000006b6ad1 in zend_objects_store_del_ref_by_handle_ex() 
#9 0x00000000006b6af3 in zend_objects_store_del_ref() 
#10 0x0000000000683662 in _zval_ptr_dtor() 
#11 0x000000000069f313 in zend_hash_destroy() 
#12 0x00000000006b2ae9 in zend_object_std_dtor() 
#13 0x00000000006b2b09 in zend_objects_free_object_storage() 
#14 0x00000000006b663f in zend_objects_store_free_object_storage() 
#15 0x0000000000683c84 in ??() 
#16 0x0000000000691cd5 in ??() 
#17 0x000000000063eccf in php_request_shutdown() 
#18 0x000000000072c76c in ??() 
#19 0x00007ffff55f5eff in __libc_start_main() from /lib/x86_64-linux-gnu/libc.so.6 
#20 0x0000000000428859 in _start() 
+4

estoy tan cansado ... aprenderé cómo enviar errores mañana ... no sé lo que estoy haciendo ... tan cansado ... error estúpido ... odio este error ... tedio – John

+2

@John: compartimos el código, compartimos los errores;) – hakre

0

acabo permitido en mi máquina Linux. Luego depuré el código en PHPStorm, que me ha proporcionado las líneas exactas de código que causaron el error.

El error se debió a la llamada recursiva a la función en mi caso por ej .:

public function1() 
{ 
    $this->function2(); 
} 

public function2() 
{ 
    $this->function1(); 
} 

espero que esto le ayuda.

Gracias,

Dipti

Cuestiones relacionadas