2016-08-05 27 views
-1

Ich habe ein seltsames und nerviges Problem mit einer der Anwendung, die ich bei der Arbeit verwenden. Die Anwendung wird in C++ geschrieben, und wenn die Anwendung beendet wird (entweder die Hauptfunktionsrückgabe oder exit wird aufgerufen), stürzt sie mit einem Segmentierungsfehler ab. Der Segmentierungsfehler scheint durch den doppelten Zeiger im Destruktor der Klasse basic_string verursacht worden zu sein. Ich kann den Quellcode nicht hinzufügen, aber ich kann sagen, dass die App extrem einfach ist und ich nicht direkt einen Zeiger in meinem Code verwende. Die App ruft nur eine Funktion aus einer Bibliothek auf.SegFault auf Anwendung beenden

Valgrid identifiziert das folgende Problem:

==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== 

Die Anwendung auf Gemeinschafts- und statische Bibliothek verknüpft ist. Function.so ist eine gemeinsam genutzte Bibliothek, die möglicherweise statischen Code enthält. Dieses Problem hängt mit der Verknüpfungsphase zusammen, da die App abhängig von der Reihenfolge, in der Bibliotheken mit meiner ausführbaren Datei verknüpft sind, möglicherweise nicht abstürzt.

Ich habe wirklich Mühe, dieses Problem anzugehen, jede Idee, was könnte die Ursache für ein solches Problem sein? Irgendein Vorschlag, wie man vorgeht, um dieses Problem zu untersuchen?

+2

Können Sie in den Code der Bibliothek schauen? Vielleicht haben einige statische Daten einen fehlerhaften Destruktor oder Konstruktor. –

+0

Ja, ich besitze die lib. Ich kann es mir ansehen –

Antwort

1

Die Ursache für dieses Problem ist ein Fehler irgendwo in Ihrem Code. Der Fehler kann alles sein. Wild Zeiger-Dereferenzierung, läuft vom Ende des Arrays oder eine beliebige Anzahl von anderen unzähligen Arten von Fehlern. Ein Fehler in C++ - Code bedeutet nicht unbedingt, dass die Anwendung sofort abstürzt. Die Anwendung kann weiter ausgeführt werden, stürzt jedoch zu einem späteren Zeitpunkt ab, wenn sie versucht, auf den fehlerhaften Speicher zuzugreifen, der aus dem Fehler resultiert.

In Ihrem Code befindet sich ein Fehler, der wahrscheinlich zu einer Speicherbeschädigung führt, die diesen Absturz beim Beenden der Anwendung auslöst. Sie müssen es finden und beheben. Willkommen in C++.

+0

Irgendwelche Vorschläge, Werkzeuge, die ich benutzen kann, um mir bei der Suche nach dem Fehler zu helfen? –

+0

'Valgrind' ist oft sehr gut darin, diese Art von Fehlern zu finden. Es wird nicht immer funktionieren, aber wird sie normalerweise finden. Das beste Werkzeug ist immer das eigene Gehirn. –