c++ कार्यक्रम समाप्त होने पर__tcf_0 पर विभाजन त्रुटि



segmentation-fault exit-code (1)

जब कार्यक्रम निकलता है, तो जानकारी दी जाती है:

*** glibc detected *** double free or corruption (!prev): 0x09a8fcb8 ***

ऐसा लगता है कि एक ऑब्जेक्ट पर डबल फ्री फिर मैंने coredump फ़ाइल को डीबग करने के लिए gdb का उपयोग किया। निम्नलिखित बीटी परिणाम (अधिक निशान पोस्ट नहीं किए गए हैं) हैं:

#0 0x005197a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
#1 0x0055a825 in raise () from /lib/tls/libc.so.6
#2 0x0055c289 in abort () from /lib/tls/libc.so.6
#3 0x0058ecda in __libc_message () from /lib/tls/libc.so.6
#4 0x0059556f in _int_free () from /lib/tls/libc.so.6
#5 0x0059594a in free () from /lib/tls/libc.so.6
#6 0x00c0f001 in operator delete (ptr=0x0) at ../../../../gcc-4.2.2/libstdc++-v3/libsupc++/del_op.cc:49
#7 0x00bea48d in std::string::_Rep::_M_destroy (this=0x9a8fcb8, [email protected])
  at /home/robert_bu/src/build_gcc-4.2.2/i686-pc-linux-gnu/libstdc++-v3/include/ext/new_allocator.h:97
#8 0x070807e8 in __tcf_0 () from ./../bin/../lib/librlxvm_kmmpv_ocp_tl2.so
#9 0x0055d5a7 in exit () from /lib/tls/libc.so.6
...

तब valgrind के परिणाम से मुझे पता चलता है कि स्ट्रिंग को दो अलग अलग .so फ़ाइल (libkmm.so.2.0.0 और libpv.so.2.0.0) से हटा दिया गया है। विस्तृत जानकारी (कुछ पंक्तियां मुखौटे वाली हैं):

==28125== Invalid free() / delete / delete[]
==28125==    at 0x400588F: operator delete(void*) (vg_replace_malloc.c:387)
==28125==    by 0x446548C: std::string::_Rep::_M_destroy(std::allocator<char> const&) (new_allocator.h:97)
==28125==    by 0x55FA7E7: __tcf_0 (in /home/alan_tao/vm/test/lib/libkmm.so.2.0.0)
==28125==    by 0x55D5A6: exit (in /lib/tls/libc-2.3.4.so)
==28125==    by 0x42B10D9: stop_sim() (in /home/alan_tao/vm/test/lib/libcomm.so.2.0.0)
==28125==    by 0x807C83A: func_on_exit(int) (in /home/alan_tao/vm/test/bin/engine)
==28125==    by 0x55A917: ??? (in /lib/tls/libc-2.3.4.so)
...
==28125==  Address 0x4a484d0 is 0 bytes inside a block of size 525 free'd
==28125==    at 0x400588F: operator delete(void*) (vg_replace_malloc.c:387)
==28125==    by 0x446548C: std::string::_Rep::_M_destroy(std::allocator<char> const&) new_allocator.h:97)
==28125==    by 0x650C0B7: __tcf_0 (in /home/alan_tao/vm/test/lib/libpv.so.2.0.0)
==28125==    by 0x55D5A6: exit (in /lib/tls/libc-2.3.4.so)
==28125==    by 0x42B10D9: stop_sim() (in /home/alan_tao/vm/test/lib/libcomm.so.2.0.0)
==28125==    by 0x807C83A: func_on_exit(int) (in /home/alan_tao/vm/test/bin/engine)
==28125==    by 0x55A917: ??? (in /lib/tls/libc-2.3.4.so)

...

Valgrind परिणाम दिखाता है कि एक स्ट्रिंग दो बार नष्ट हो जाती है लेकिन मुझे सही स्थिर एक नहीं पता है किस स्ट्रिंग को त्रुटि को हटाना और इसे ठीक करने के तरीके को हटाने का कोई भी विचार है? धन्यवाद

पीएस: प्रोग्राम लिनक्स 2.6.9 के तहत चल रहा है। जीसीसी संस्करण 4.2.2 है dll उपयोग किया जाता है

नया अद्यतन: जीबीबी का उपयोग करने के लिए त्रुटि लिब फ़ाइल की सूची, कमांड "l __tcf_0" मुझे निम्न कोड दिखाता है:

inline std::vector<const char*>& get_phase_name_vec(){
  static std::vector<const char*> phase_name_vec(END_RESP+1, (const char*)NULL);
  return phase_name_vec;
}

यह ओएससीआई टीएलएम हेडर फाइल से है और उपरोक्त पुस्तकालयों में उन्हें शामिल करना होगा। यह एक अलग नाम स्थान "tlm" में है इस त्रुटि को ठीक करने के लिए कोई भी विचार?


समस्या सुलझ गई है। वहाँ libkmm.so.2.0.0 के स्रोत और tlm हेडर फाइल में एक वैश्विक चर नाम टक्कर है।

ऐसा लगता है कि "__tcf_0" सही वैरिएबल नहीं दिखाता है धन्यवाद एलेक्स, मैवरिक, इलियन शर्बानियो और अन्य लोग इस प्रश्न को पढ़ रहे हैं।





exit-code