2011-12-17 73 views
8

Tại sao mã sau gây ra lỗi phân đoạn?Lỗi phân đoạn trong 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(); 
?> 

Ghi chú bổ sung

1) Tôi chạy mã này trên hai máy chủ ĐÈN khác nhau và cả hai đều tạo ra lỗi như child pid somenumber exit signal Segmentation fault (11) trong các tập tin error.log tôi. Trên một máy chủ, tôi đang chạy Ubuntu 10.04, Apache 2, Mysql 5 và PHP 5.3.2-1ubuntu4.9, và trên một máy chủ khác tôi đang chạy Ubuntu 11.10, Apache 2, mysql 5 và PHP 5.3.6-13ubuntu3.3 .

2) Thật kỳ lạ, nhưng khi tôi nhận xét dòng $d2 = new DAO(); hoặc dòng exit;, lỗi phân đoạn sẽ biến mất.

3) Lỗi phân đoạn xảy ra bất kể bảng db nào tôi chọn trong câu lệnh đã chuẩn bị

Điều gì đang xảy ra? Tôi rất thất vọng. Tôi đã mất thời gian cả ngày vì lỗi phân đoạn này. Làm ơn ... nếu có ai biết được điều gì đang xảy ra, cho tôi biết

Cảm ơn

+3

Điều tốt nhất để làm là thả smarty hoàn toàn. Đó là chi phí không cần thiết. * "Này, chúng ta hãy thêm một động cơ templating trên đầu trang của PHP, mà là một động cơ templating chính nó!" * ': Rolleyes:' – NullUserException

+0

Mã bạn đang thấy ở trên chỉ là một phiên bản chưng cất của một vấn đề tồn tại trong 5 năm phần mềm cũ. Vì vậy, tôi không thể thực sự thông minh mà không cần viết lại hàng trăm trang mã. – John

+1

Nó chỉ là một thử nghiệm, nhưng trong constuctor, trước tiên bạn có thể nhập biến toàn cầu và gán nó vào một địa phương trước khi sử dụng nó? Có lẽ segfault biến mất. Nó chỉ là một ý tưởng, vì vậy không có bảo đảm. – hakre

Trả lời

6

Hình như bạn tìm thấy một lỗi trong các mô-đun mysqli!

Gửi nó đến https://bugs.php.net/

Đừng nghĩ rằng nó được cố định vào ngày mai, mặc dù. Tìm cách khắc phục lỗi hoặc thử sử dụng các phiên bản PHP/mysqli khác nhau để xem bạn có thể nhận được hay không.

Để tham khảo, tôi cũng có thể tạo lại nó và đây là một backtrace. Có vẻ như mọi thứ đang bùng nổ trong khi cố gắng đóng kết nối và dọn dẹp mọi thứ:

[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

tôi rất mệt mỏi .... tôi sẽ tìm hiểu làm thế nào để gửi lỗi vào ngày mai ... Tôi không biết những gì tôi đang làm .. cũng mệt mỏi ... lỗi ngu ngốc ... tôi ghét lỗi này .. đã từng yêu cầu – John

+2

@ John: Chúng tôi chia sẻ mã, chúng tôi chia sẻ các lỗi;) – hakre

0

Tôi vừa kích hoạt xdebugger trong máy Linux của mình. Sau đó, tôi gỡ lỗi mã trong PHPStorm mà đã cho tôi những dòng mã chính xác gây ra lỗi.

Lỗi là do cuộc gọi đệ quy để các chức năng trong trường hợp của tôi cho ví dụ .:

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

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

Tôi hy vọng điều này sẽ giúp bạn.

Cảm ơn,

Dipti