2011-12-17 21 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)私は2台の異なる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テーブルに関係なく発生しますか?私はとても不満です。私はこのセグメンテーション違反のために1日分の時間を失いました。誰もが何が起こっているのか知っていれば...、あなたはmysqliのモジュールのバグを見つけた

おかげ

+3

行うための最善のことは、完全にSmartyのドロップすることです。不要なオーバーヘッドです。 * "ねえ、テンプレートエンジンであるPHPの上にテンプレートエンジンを追加してみましょう" *: ':rolleyes:' – NullUserException

+0

あなたが見ているコードは、5年以内に存在する問題の単なる蒸留バージョンです古いソフトウェア。だから、数百ページのコードを書き直すことなく、すごく落とすことはできません。 – John

+1

これは単なるテストですが、コンストラクタでは、グローバル変数をインポートしてからローカル変数に割り当てることができますか?多分、セグメンテーションがなくなるでしょう。それは単なるアイデアなので、保証はありません。 – hakre

答えて

6

が見える私に知らせてください!

https://bugs.php.net/

に提出してくださいは、しかし、それは明日に固定されることを期待しないでください。バグを回避する方法を探したり、別のPHP/mysqliバージョンを使って取得できるかどうかを試してみてください。

参考までに再現することができますが、ここではバックトレースです。

[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

私はとても疲れています....私は明日バグを提出する方法を学びます...私は何を私はやっています。疲れています。ばかげたバグ...私はこのバグを嫌っています。 – John

+2

@John:コードを共有しています。バグを共有しています;) – hakre

0

私はLinuxマシンでxdebuggerを有効にしたばかりです。接続を閉じてクリーンアップしようとしているうちに、爆発しているようです。次に私はPHPStormのコードをデバッグし、私にエラーの原因となったコード行を与えてくれました。

エラーは、例えばのための私の場合は関数の再帰呼び出し:私はこれがあなたの役に立てば幸い

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

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

にしました。

おかげで、

Dipti

関連する問題