2011-12-29 32 views
5

Tôi đã viết một ứng dụng bằng C++ sử dụng Qt 4.7.4. Khi khởi động, nó tải một số thư viện động tự viết cũng sử dụng Qt (nếu điều này có thể hữu ích theo cách).Tại sao thỉnh thoảng ứng dụng của tôi gặp sự cố với SIGSEGV khi nó bị đóng?

Khi thoát khỏi chương trình, thỉnh thoảng nó bị treo với một SIGSEGV và vết lùi sau:

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

và đôi khi điều này một

#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 

hay này một

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

Và có là một số chi tiết ...

Tôi nghĩ rằng tất cả đều liên quan nhưng tôi thực sự không thể tìm ra cách và tại sao điều này xảy ra (lưu ý rằng không có dấu vết nào trong mã của tôi được liệt kê).

Cảm ơn bạn rất nhiều vì một số gợi ý, tại sao điều này có thể xảy ra hoặc nơi tôi nên bắt đầu tìm kiếm.

Trả lời

6

Tôi đã tìm ra giải pháp cho vấn đề của mình: Tôi đã liên kết một thư viện tĩnh với ứng dụng chính và thư viện động của tôi. Thư viện tĩnh này sử dụng Qt sử dụng các biến toàn cầu. Khi tắt ứng dụng, các thư viện động đã được tải xuống từ ứng dụng của tôi. Điều này dẫn đến việc xóa các biến toàn cầu của Qt. Nhưng việc tắt các ứng dụng của nó đã dẫn đến việc xóa các biến toàn cầu tương tự một lần nữa đã kết thúc trong SIGSEGV.

Giải pháp là thay đổi thư viện tĩnh thành thư viện động. Bây giờ các biến toàn cầu chỉ bị xóa một lần, vì tất cả các thư viện được chia sẻ và ứng dụng chính đang sử dụng mã Qt "giống nhau".

2

Từ khung ngăn xếp của coredumps có vẻ như bạn đã hỏng heap một nơi nào đó hoặc đang giải phóng con trỏ không hợp lệ.

Cách tốt nhất để gỡ lỗi các vấn đề này là lập hồ sơ cho mã của bạn bằng các công cụ lược tả bộ nhớ như valgrind hoặc Rational Purify plus (có nhiều công cụ tìm kiếm trên google nên trợ giúp). Những công cụ lược tả này sẽ chỉ ra nguyên nhân gốc rễ của vấn đề.

Các vấn đề liên quan