2011-12-17 8 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) मैं दो अलग अलग दीप सर्वर पर इस कोड को भाग गया और वे दोनों मेरी error.log फाइलों में child pid somenumber exit signal Segmentation fault (11) तरह त्रुटियों उत्पन्न करते हैं। एक सर्वर पर, मैं उबंटू 10.04, अपाचे 2, माइस्क्ल 5 और PHP 5.3.2-1ubuntu4.9 चला रहा हूं, और दूसरे सर्वर पर मैं उबंटू 11.10, अपाचे 2, माइस्क्ल 5 और PHP 5.3.6-13ubuntu3.3 चला रहा हूं ।

2) यह अजीब है, लेकिन जब मैं $d2 = new DAO(); या लाइन exit; लाइन पर टिप्पणी करता हूं, तो सेगमेंटेशन गलती दूर हो जाती है।

3) विभाजन गलती चाहे किसी भी db तालिका मैं तैयार बयान

में से चयन क्या चल रहा है तब होता है? मैं बहुत निराश हूँ। इस सेगमेंटेशन गलती के कारण मैंने पूरे दिन के लायक समय खो दिए हैं। करें ... किसी को भी जानता है क्या हो रहा है, मुझे पता है

धन्यवाद

+3

करने के लिए सबसे अच्छी बात पूरी तरह चतुर ड्रॉप करने के लिए है। यह अनावश्यक उपरि है। * "अरे, चलिए PHP के शीर्ष पर एक टेम्पलेटिंग इंजन जोड़ें, जो एक टेम्पलेटिंग इंजन है!" * ': राउलीज़:' – NullUserException

+0

जो कोड आप ऊपर देख रहे हैं वह एक समस्या का एक आसुत संस्करण है जो 5 वर्ष में मौजूद है पुराना सॉफ्टवेयर तो मैं कोड के सैकड़ों पृष्ठों को फिर से लिखने के बिना वास्तव में smarty ड्रॉप नहीं कर सकता। – John

+1

यह सिर्फ एक परीक्षण है, लेकिन कंसक्टर में, क्या आप पहले वैश्विक चर आयात कर सकते हैं और इसका उपयोग करने से पहले इसे स्थानीय में असाइन कर सकते हैं? शायद segfault दूर चला जाता है। यह सिर्फ एक विचार है, इसलिए कोई गारंटी नहीं है। – hakre

उत्तर

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() 
+4

मैं बहुत थक गया हूं .... मैं कल बग सबमिट करना सीखूंगा ... मुझे नहीं पता कि मैं क्या जानता हूं मैं कर रहा हूँ..तो थक गया .. बेवकूफ बग ... मुझे इस बग से नफरत है ... – John

+2

@ जॉन: हम कोड साझा करते हैं, हम बग साझा करते हैं;) – hakre

0

मैं सिर्फ सक्षम किया है xdebugger। फिर मैंने PHPStorm में कोड डीबग किया जिसने मुझे कोड की सटीक रेखाएं दी हैं जो त्रुटि उत्पन्न करती हैं।

त्रुटि उदाहरण के लिए मेरे मामले में कार्य करने के लिए पुनरावर्ती कॉल .:

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

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

मुझे आशा है कि इस मदद करता है की वजह से था।

धन्यवाद,

दीप्ति