2011-12-17 59 views
8

爲什麼下面的代碼會導致分段錯誤?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(); 
?> 

其他注意事項

1)我跑在兩個不同的LAMP服務器的代碼,他們都產生就像在我的error.log文件child pid somenumber exit signal Segmentation fault (11)錯誤。在一臺服務器上,我運行Ubuntu 10.04,Apache 2,Mysql 5和PHP 5.3.2-1ubuntu4.9,並在另一臺服務器上運行Ubuntu 11.10,Apache 2,MySQL 5和PHP 5.3.6-13ubuntu3.3 。

2)這很奇怪,但是當我註釋掉行$d2 = new DAO();或行exit;時,分段錯誤消失。

3)段故障發生時,不管發生了什麼事我從準備好的聲明

選擇哪個db表?我很沮喪。由於這種分段錯誤,我失去了整整一天的時間。請...如果有人知道發生了什麼事,讓我知道

感謝

+3

做的最好的事情是完全放棄智者。這是不必要的開銷。 *「嘿,讓我們在PHP之上添加一個模板引擎,這是一個模板引擎本身!」*`:rolleyes:` – NullUserException 2011-12-17 02:48:00

+0

您在上面看到的代碼僅僅是5年中存在的問題的蒸餾版本舊的軟件。因此,如果不重寫數百頁的代碼,我就不能真正放棄。 – John 2011-12-17 02:51:33

回答

6

看起來你找到了mysqli的模塊中的錯誤!

將其提交給https://bugs.php.net/

不要指望它明天固定的,雖然。尋找一種解決錯誤的方法,或嘗試使用不同的PHP/mysqli版本來查看是否可以通過。

作爲參考,我可以重現它,這裏是一個回溯。看起來試圖關閉了連接和乾淨的東西東西爆炸:在我的Linux機器

[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() 
0

我剛剛啓用xdebugger。然後我調試了PHPStorm中的代碼,它給了我導致錯誤的確切代碼行。

錯誤是由於我的情況遞歸調用的函數例如爲:

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

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

我希望這可以幫助你。

感謝,

Dipti