PHP中的分段错误?

PHP中的分段错误?,php,segmentation-fault,mysqli,Php,Segmentation Fault,Mysqli,为什么以下代码会导致分段错误 <?php $CNX = new mysqli('localhost','dbuser', 'dbpass', 'dbtest'); class DAO { var $stmt; function DAO() { $this->stmt = $GLOBALS['CNX']->stmt_init(); } function list

为什么以下代码会导致分段错误

<?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=newdao()或行
退出,分段错误消失

3) 无论我在准备好的语句中选择哪个db表,都会发生分段错误

发生了什么事?我很沮丧。因为这个错误,我损失了整整一天的时间。请…如果有人知道发生了什么,请告诉我


谢谢

看起来你在mysqli模块中发现了一个bug

提交给

不过,别指望明天就能修好。找到一种解决这个bug的方法,或者尝试使用不同的PHP/mysqli版本,看看是否可以通过

作为参考,我也可以复制它,这里有一个回溯。在尝试关闭连接并清理时,情况似乎正在爆炸:

jon@jonx:~/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 ()

我刚刚在我的Linux机器上启用了xdebugger。然后我调试了PHPStorm中的代码,它给出了导致错误的确切代码行

在我的例子中,错误是由于递归调用函数造成的,例如:

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

public function2()
{
    $this->function1();
}
我希望这对你有帮助

谢谢


迪普蒂

最好的办法是把斯玛蒂彻底抛弃。这是不必要的开销。“嘿,让我们在PHP之上添加一个模板引擎,它本身就是一个模板引擎!”
:rolleyes:
您在上面看到的代码只是一个5年前的软件中存在的问题的提炼版本。因此,如果不重写数百页的代码,我就无法真正删除smarty。这只是一个测试,但在构造函数中,您能否先导入全局变量并将其分配给局部变量,然后再使用它?也许断层消失了。这只是一个想法,所以不能保证。@hakre-谢谢,我试过了,但仍然存在seg故障。你100%肯定这与Smarty有关吗?尝试创建一个最小的示例,例如,我太累了…我明天将学习如何提交bug…我不知道我在做什么…太累了…愚蠢的bug…我讨厌这个bug…累了