2011-12-17 14 views
8

Perché il seguente codice causa un errore di segmentazione?Errore di segmentazione in 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(); 
?> 

note aggiuntive

1) mi sono imbattuto questo codice su due diversi server LAMP ed entrambi generano errori come child pid somenumber exit signal Segmentation fault (11) nei miei file error.log. Su un server, sto usando Ubuntu 10.04, Apache 2, Mysql 5 e PHP 5.3.2-1ubuntu4.9, e su un altro server sto usando Ubuntu 11.10, Apache 2, mysql 5 e PHP 5.3.6-13ubuntu3.3 .

2) È strano, ma quando commento la linea $d2 = new DAO(); o la riga exit;, l'errore di segmentazione scompare.

3) L'errore di segmentazione si verifica indipendentemente da quale tabella db seleziono dal nella dichiarazione preparata

Che cosa sta succedendo? Sono così frustrato. Ho perso un'intera giornata di tempo a causa di questo errore di segmentazione. Si prega di ... se qualcuno sa cosa sta succedendo, me lo faccia sapere

Grazie

+3

La cosa migliore da fare è far cadere smarty del tutto. È un sovraccarico inutile. * "Ehi, aggiungiamo un motore di template su PHP, che è un motore di template stesso!" * ': Rolleyes:' – NullUserException

+0

Il codice che vedi qui sopra è solo una versione distillata di un problema che esiste in 5 anni vecchio software. Quindi non posso davvero rinunciare a smarty senza riscrivere centinaia di pagine di codice. – John

+1

È solo un test, ma nel constuctor, è possibile importare prima la variabile globale e assegnarla a una locale prima di usarla? Forse il segfault sparisce. È solo un'idea, quindi nessuna garanzia. – hakre

risposta

6

assomiglia ad aver trovato un bug nel modulo mysqli!

sottopone al https://bugs.php.net/

Non aspettatevi di essere risolto domani, però. Trova un modo per aggirare il bug o prova a utilizzare diverse versioni di PHP/mysqli per vedere se riesci a cavartela.

Per riferimento, posso anche riprodurlo, ed ecco un backtrace. Sembra che le cose stanno esplodendo durante il tentativo di chiudere la connessione e le cose pulite up: 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

sono così stanco .... imparerò come inviare bug domani ... Non so cosa ho sto facendo..so stanco ... insetto bug ... odio questo bug..tired – John

+2

@ John: condividiamo il codice, condividiamo i bug;) – hakre

0

ho appena abilitata nella mia macchina Linux. Poi ho eseguito il debug del codice in PHPStorm che mi ha fornito le righe esatte del codice che ha causato l'errore.

L'errore è dovuto alla chiamata ricorsiva alla funzione nel mio caso per es .:

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

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

Spero che questo ti aiuta.

Grazie,

Dipti