2016-08-05 155 views
-1

我在工作中使用的某个应用程序遇到了一个奇怪而烦人的问题。该应用程序是用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是一个可能包含一些静态代码的共享库。这个问题与链接阶段有关,因为根据库链接到我的可执行文件的顺序,应用程序可能不会崩溃。

我真的很努力地解决这个问题,任何想法可能是这个问题的根源呢?任何建议如何着手调查这个问题?

+2

你可以看看图书馆的代码里面吗?也许一些静态数据具有错误的析构函数或构造函数。 –

+0

是的,我拥有lib。我可以看看它 –

回答

1

此问题的根本原因是您的代码中存在一处错误。该错误可以是任何东西。野指针解引用,运行在数组末尾,或任何其他种类繁多的错误。 C++代码中的错误并不一定意味着应用程序会立即崩溃。应用程序可以继续执行,但在稍后尝试访问由错误导致的损坏内存时会崩溃。

代码中存在一处可能导致内存损坏的错误,当应用程序终止时会触发此崩溃。你需要找到它并修复它。欢迎来到C++。

+0

任何建议,我可以用来帮助我找到bug的工具吗? –

+0

'valgrind'通常很擅长找到这些类型的错误。它不会总是有效,但通常会找到它们。最好的工具永远是自己的大脑。 –