我在工作中使用的某个应用程序遇到了一个奇怪而烦人的问题。该应用程序是用C++编写的,当应用程序终止时(主函数返回或调用exit
),它会崩溃并出现分段错误。分段错误似乎是由basic_string类析构函数中的双释放指针造成的。我无法添加源代码,但我可以说该应用程序非常简单,我不直接在我的代码中使用任何指针。该应用程序只是从库中调用一个函数。SegFault退出应用程序
Valgrid标识以下问题:
==5402== Invalid read of size 4
==5402== at 0x549F05F: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() (atomicity.h:49)
==5402== by 0x41D1BA4: ??? (in ../Functions.so)
==5402== by 0x436D873: ??? (in ../Functions.so)
==5402== by 0x967674: _dl_fini (in /lib/ld-2.12.so)
==5402== by 0x9A7EAE: exit (in /lib/libc-2.12.so)
==5402== by 0x810F8C2: main (Checker.C:146)
==5402== Address 0x55ec808 is 8 bytes inside a block of size 15 free'd
==5402== at 0x4007895: operator delete(void*) (vg_replace_malloc.c:480)
==5402== by 0x549EF67: std::string::_Rep::_M_destroy(std::allocator<char> const&) (new_allocator.h:110)
==5402== by 0x810F8C2: main (Checker.C:146)
==5402==
==5402== Invalid free()/delete/delete[]/realloc()
==5402== at 0x4007895: operator delete(void*) (vg_replace_malloc.c:480)
==5402== by 0x549EF67: std::string::_Rep::_M_destroy(std::allocator<char> const&) (new_allocator.h:110)
==5402== by 0x41D1BA4: ??? (in ..../Functions.so)
==5402== by 0x436D873: ??? (in .../Functions.so)
==5402== by 0x967674: _dl_fini (in /lib/ld-2.12.so)
==5402== by 0x9A7EAE: exit (in /lib/libc-2.12.so)
==5402== by 0x810F8C2: main (Checker.C:146)
==5402== Address 0x55ec800 is 0 bytes inside a block of size 15 free'd
==5402== at 0x4007895: operator delete(void*) (vg_replace_malloc.c:480)
==5402== by 0x549EF67: std::string::_Rep::_M_destroy(std::allocator<char> const&) (new_allocator.h:110)
==5402== by 0x810F8C2: main (Checker.C:146)
==5402==
应用程序被链接到共享和静态库。 Function.so
是一个可能包含一些静态代码的共享库。这个问题与链接阶段有关,因为根据库链接到我的可执行文件的顺序,应用程序可能不会崩溃。
我真的很努力地解决这个问题,任何想法可能是这个问题的根源呢?任何建议如何着手调查这个问题?
你可以看看图书馆的代码里面吗?也许一些静态数据具有错误的析构函数或构造函数。 –
是的,我拥有lib。我可以看看它 –