2011-12-17 26 views
8

Dlaczego następujący kod powoduje błąd segmentacji?Błąd segmentacji w 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(); 
?> 

Uwagi dodatkowe

1) Pobiegłem ten kod na dwóch różnych serwerach LAMP i obaj generować błędy jak child pid somenumber exit signal Segmentation fault (11) w moim error.log plików. Na jednym serwerze korzystam z Ubuntu 10.04, Apache 2, Mysql 5 i PHP 5.3.2-1ubuntu4.9, a na innym serwerze mam Ubuntu 11.10, Apache 2, mysql 5 i PHP 5.3.6-13ubuntu3.3 .

2) To dziwne, ale kiedy komentuję linię $d2 = new DAO(); lub linię exit;, błąd segmentacji znika.

3) Usterka segmentacji występuje bez względu na które db tabela I wybierać spośród w przygotowanym oświadczeniu

Co się dzieje? Jestem tak sfrustrowany. Straciłem cały dzień z powodu tego błędu segmentacji. Proszę ... jeśli ktoś wie co się dzieje, daj mi znać

Dzięki

+3

Najlepszą rzeczą do zrobienia jest spadek smarty całkowicie. To niepotrzebne obciążenie. * "Hej, dodajmy silnik szablonowy na PHP, który jest samym silnikiem szablonowym!" * ': Rolleyes:' – NullUserException

+0

Powyższy kod jest po prostu destylowaną wersją problemu, który istnieje w ciągu 5 lat stare oprogramowanie. Więc nie mogę upuścić smarty bez przepisywania setek stron kodu. – John

+1

To tylko test, ale w konduktorze, czy najpierw można zaimportować zmienną globalną i przypisać ją do lokalnej przed jej użyciem? Może segfault zniknie. To tylko pomysł, więc nie ma gwarancji. – hakre

Odpowiedz

6

wygląda znalazłeś błąd w module mysqli!

Prześlij go https://bugs.php.net/

Nie spodziewaj się, że mają być ustalone jutro, choć. Znajdź sposób obejścia błędu lub spróbuj użyć różnych wersji PHP/mysqli, aby sprawdzić, czy możesz sobie poradzić.

W celach informacyjnych mogę je również odtworzyć, a tutaj jest śledzenie. Wygląda na to, że rzeczy wybuchają, próbując zamknąć połączenie i posprzątać:

[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

Jestem tak zmęczony .... nauczę się zgłaszać błąd jutro ... Nie wiem co Robię ... tak zmęczony ... głupi błąd ... Nienawidzę tego błędu .. Jestem zmęczony – John

+2

@John: Udostępniamy kod, dzielimy się błędami;) – hakre

0

Właśnie włączyłem xdebugger na moim komputerze z Linuksem. Następnie debugowałem kod w PHPStorm, który dał mi dokładne linie kodu, które spowodowały błąd.

Błąd spowodowany był rekurencyjnego wywołania funkcji w moim przypadku do np .:

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

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

Mam nadzieję, że to pomaga.

Dzięki,

Dipti

Powiązane problemy