2011-12-29 13 views
5

Napisałem aplikację w języku C++, która używa Qt 4.7.4. Podczas uruchamiania ładuje niektóre autoodpowiedziowe biblioteki dynamiczne, które również używają Qt (jeśli może to być przydatne w pewien sposób).Dlaczego moja aplikacja ulega awarii przy włączonym SIGSEGV?

Podczas zamykania aplikacji, czasami wywala z SIGSEGV i następujących backtrace:

#0 malloc_consolidate (av=0x7ffff58b21c0) at malloc.c:5155 
#1 0x00007ffff5591659 in malloc_consolidate (av=0x7ffff58b21c0) at malloc.c:5115 
#2 _int_free (av=0x7ffff58b21c0, p=<optimized out>) at malloc.c:5034 
#3 0x00007ffff5594d7c in __GI___libc_free (mem=<optimized out>) at malloc.c:3738 
#4 0x00007ffff5e9e0ac in QString::free (d=0xdb0290) at tools/qstring.cpp:1186 
#5 0x00007fffe60b3d83 in ~QString (this=0xba0328, __in_chrg=<optimized out>) at ../../include/QtCore/../../src/corelib/tools/qstring.h:883 
#6 node_destruct (to=0xba0328, from=0xba0328, this=<optimized out>) at ../../include/QtCore/../../src/corelib/tools/qlist.h:420 
#7 QList<QString>::free (data=0xba0310, this=<optimized out>) at ../../include/QtCore/../../src/corelib/tools/qlist.h:744 
#8 0x00007fffe60c2b49 in ~QList (this=0xba0388, __in_chrg=<optimized out>) at ../../include/QtCore/../../src/corelib/tools/qlist.h:719 
#9 ~QStringList (this=0xba0388, __in_chrg=<optimized out>) at ../../include/QtCore/../../src/corelib/tools/qstringlist.h:66 
#10 ~SignalHook (this=0xba0358, __in_chrg=<optimized out>) at qdbusconnection_p.h:121 
#11 ~QHashNode (this=0xba0340, __in_chrg=<optimized out>) at ../../include/QtCore/../../src/corelib/tools/qhash.h:216 
#12 QHash<QString, QDBusConnectionPrivate::SignalHook>::deleteNode2 (node=0xba0340) at ../../include/QtCore/../../src/corelib/tools/qhash.h:519 
#13 0x00007ffff5e754da in QHashData::free_helper (this=0xd8aec0, node_delete=0x7fffe60c2ae0 <QHash<QString, QDBusConnectionPrivate::SignalHook>::deleteNode2(QHashData::Node*)>) at tools/qhash.cpp:271 
#14 0x00007fffe60ba733 in freeData (x=<optimized out>, this=<optimized out>) at ../../include/QtCore/../../src/corelib/tools/qhash.h:568 
#15 ~QHash (this=<optimized out>, __in_chrg=<optimized out>) at ../../include/QtCore/../../src/corelib/tools/qhash.h:284 
#16 ~QMultiHash (this=0xba3498, __in_chrg=<optimized out>) at ../../include/QtCore/../../src/corelib/tools/qhash.h:922 
#17 ~QMultiHash (this=0xba3498, __in_chrg=<optimized out>) at qdbusintegrator.cpp:998 
#18 QDBusConnectionPrivate::~QDBusConnectionPrivate (this=0xba33f0, __in_chrg=<optimized out>) at qdbusintegrator.cpp:998 
#19 0x00007fffe60ba939 in QDBusConnectionPrivate::~QDBusConnectionPrivate (this=0xba33f0, __in_chrg=<optimized out>) at qdbusintegrator.cpp:1016 
#20 0x00007fffe60afe43 in ~QDBusDefaultConnection (this=0xba55a0, __in_chrg=<optimized out>) at qdbusconnection.cpp:993 
#21 QGlobalStaticDeleter<QDBusDefaultConnection>::~QGlobalStaticDeleter (this=0x7fffe63102f8, __in_chrg=<optimized out>) at ../../include/QtCore/../../src/corelib/global/qglobal.h:1825 
#22 0x00007ffff5553821 in __run_exit_handlers (status=0, listp=0x7ffff58b05a8, run_list_atexit=true) at exit.c:78 
#23 0x00007ffff55538a5 in __GI_exit (status=<optimized out>) at exit.c:100 
#24 0x00007ffff5539314 in __libc_start_main (main=0x493935 <main(int, char**)>, argc=1, ubp_av=0x7fffffffde58, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffde48) at libc-start.c:258 
#25 0x0000000000421a99 in _start() 

i czasami ten

#0 malloc_consolidate (av=0x7ffff58b21c0) at malloc.c:5155 
#1 0x00007ffff5591659 in malloc_consolidate (av=0x7ffff58b21c0) at malloc.c:5115 
#2 _int_free (av=0x7ffff58b21c0, p=<optimized out>) at malloc.c:5034 
#3 0x00007ffff5594d7c in __GI___libc_free (mem=<optimized out>) at malloc.c:3738 
#4 0x00007ffff5f4d5a9 in ~QVector (this=0x767c40, __in_chrg=<optimized out>) at ../../include/QtCore/../../src/corelib/tools/qvector.h:119 
#5 QGlobalStaticDeleter<QVector<QCustomTypeInfo> >::~QGlobalStaticDeleter (this=0x7ffff6274898, __in_chrg=<optimized out>) at ../../include/QtCore/../../src/corelib/global/qglobal.h:1825 
#6 0x00007ffff5553c3d in __cxa_finalize (d=0x7ffff6273d20) at cxa_finalize.c:56 
#7 0x00007ffff5e3e0a6 in __do_global_dtors_aux() from /usr/lib/x86_64-linux-gnu/libQtCore.so.4 
#8 0x00007fffffffd7c0 in ??() 
#9 0x00007fffffffdd30 in ??() 
#10 0x00007ffff5f9e5a1 in _fini() from /usr/lib/x86_64-linux-gnu/libQtCore.so.4 
#11 0x000000000000009f in ??() 
#12 0x00007ffff7deb105 in ??() from /lib64/ld-linux-x86-64.so.2 

czy ten

#0 malloc_consolidate (av=0x7ffff58b21c0) at malloc.c:5155 
#1 0x00007ffff5591659 in malloc_consolidate (av=0x7ffff58b21c0) at malloc.c:5115 
#2 _int_free (av=0x7ffff58b21c0, p=<optimized out>) at malloc.c:5034 
#3 0x00007ffff5594d7c in __GI___libc_free (mem=<optimized out>) at malloc.c:3738 
#4 0x00007ffff5e86bbe in freeData (x=<optimized out>, this=<optimized out>) at ../../include/QtCore/../../src/corelib/tools/qmap.h:654 
#5 ~QMap (this=0x10af198, __in_chrg=<optimized out>) at ../../include/QtCore/../../src/corelib/tools/qmap.h:187 
#6 ~QMap (this=0x10af198, __in_chrg=<optimized out>) at tools/qvector.h:430 
#7 ~QRegExpAutomatonState (this=0x10af180, __in_chrg=<optimized out>) at tools/qregexp.cpp:947 
#8 QVector<QRegExpAutomatonState>::free (x=0x10af0f0, this=<optimized out>) at tools/qvector.h:438 
#9 0x00007ffff5e969a9 in clear (this=<optimized out>) at tools/qcache.h:139 
#10 ~QCache (this=<optimized out>, __in_chrg=<optimized out>) at tools/qcache.h:103 
#11 QGlobalStaticDeleter<QCache<QRegExpEngineKey, QRegExpEngine> >::~QGlobalStaticDeleter (this=0x7ffff6274368, __in_chrg=<optimized out>) at ../../include/QtCore/../../src/corelib/global/qglobal.h:1825 
#12 0x00007ffff5553821 in __run_exit_handlers (status=0, listp=0x7ffff58b05a8, run_list_atexit=true) at exit.c:78 
#13 0x00007ffff55538a5 in __GI_exit (status=<optimized out>) at exit.c:100 
#14 0x00007ffff5539314 in __libc_start_main (main=0x493935 <main(int, char**)>, argc=1, ubp_av=0x7fffffffde58, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffde48) at libc-start.c:258 
#15 0x0000000000421a99 in _start() 

I jest trochę więcej ...

Myślę, że wszystkie są powiązane, ale naprawdę nie mogę zrozumieć, jak i dlaczego tak się dzieje (zauważ, że w żadnym śladzie żaden z mojego kodu nie jest wymieniony).

Bardzo dziękuję za podpowiedzi, dlaczego tak się stało lub gdzie powinienem zacząć szukać.

Odpowiedz

6

Znalazłem rozwiązanie mojego problemu: Połączyłem bibliotekę statyczną z moją główną aplikacją i bibliotekami dynamicznymi. Ta biblioteka statyczna używała Qt, która używa zmiennych globalnych. Podczas zamykania aplikacji biblioteki dynamiczne zostały wyładowane z mojej aplikacji. Spowodowało to usunięcie globalnych zmiennych Qt. Ale zamknięcie aplikacji spowodowało ponowne usunięcie tych samych zmiennych globalnych, które zakończyły się SIGSEGV.

Rozwiązaniem była zmiana biblioteki statycznej na dynamiczną. Teraz zmienne globalne są usuwane tylko raz, ponieważ wszystkie udostępnione biblioteki i główna aplikacja używają tego samego "kodu" Qt.

2

Z ram stosu coredump wydaje się, że gdzieś zepsułeś stertę lub uwalniasz nieprawidłowe wskaźniki.

Najlepszym sposobem na zbadanie takich problemów jest profilowanie kodu za pomocą narzędzi do profilowania pamięci, takich jak valgrind lub Rational Purify plus (istnieje wiele takich narzędzi, które powinno pomóc wyszukiwanie w wyszukiwarce Google). Te narzędzia do profilowania powinny wskazywać na główną przyczynę problemu.

Powiązane problemy