2011-12-29 93 views
5

我寫了一個使用Qt 4.7.4的C++應用程序。啓動時,它會加載一些也使用Qt的自動動態庫(如果這可能會有用)。爲什麼我的應用程序在關閉時有時會碰到SIGSEGV?

當關閉應用程序時,有時它崩潰與SIGSEGV和以下回溯:

#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() 

,有時這一個

#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 

或這一個

#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() 

還有有更多...

我認爲他們都是相關的,但我真的不知道如何以及爲什麼會發生這種情況(請注意,沒有任何我的代碼被列出)。

非常感謝您提供一些提示,爲什麼會發生這種情況,或者我應該從哪裏開始搜索。

回答

6

我找到了解決我的問題的方法:我將一個靜態庫鏈接到我的主應用程序和我的動態庫。這個靜態庫正在使用使用全局變量的Qt。在應用程序關閉時,動態庫從我的應用程序中卸載。這導致刪除了Qt的全局變量。但是,應用程序自身的關閉導致再次刪除相同的全局變量,這在SIGSEGVs中結束。

解決方案是將靜態庫更改爲動態庫。現在全局變量只被刪除一次,因爲所有的共享庫和主應用程序都使用「相同」的Qt代碼。

2

從堆棧的coredumps看來,你已經損壞了堆或某些地方釋放了無效的指針。

調試此類問題的最佳方法是使用內存分析工具(如valgrind或Rational Purify plus)(Google搜索應該可以提供許多此類工具)來分析代碼。這些分析工具應指出問題的根源。

相關問題