簡體   English   中英

Qt QCoreApplication :: exec()在Ubuntu 12.04上崩潰

[英]qt QCoreApplication::exec() crash on ubuntu 12.04

我正在開發在Qt,Ubuntu的套接字上具有信號插槽的系統應用程序

void Receiver::startServer()
{
....
connect(udpSocket, SIGNAL(readyRead()), this, SLOT(receiveFunc()));
}

void Receiver::receiveFunc()
{


emit receiveForwarder();
{


Handler::start()
{
receiver= new Receiver();
thread=new QThread()
receiver->moveToThread(thread);
receiver->startServer();

connect(receiver, SIGNAL(receiveForwarder()), this, SLOT(processTexts()));
}

Handler::processTexts()
{



//emit another signal that is in another thread
}

我有一個processTexts函數,它既是線程的插槽,也向另一個線程發出信號。 如果我省略了Handler中的第二個send,問題仍然無法解決,但是程序稍后會崩潰。 但這並沒有消失。 一兩分鍾后它就會皺折。 程序處理來自UDP套接字的文本。 並通過另一個QTcpSocket將其發送到另一個程序。

崩潰簽名是:

0[bt:0]/application/collector/main.cpp::exceptionHandler(int)::30
./collector(_Z16exceptionHandleri+0x56)[0x422156]
/lib/x86_64-linux-gnu/libc.so.6(+0x364c0)[0x7fbf348f54c0]
/usr/lib/x86_64-linux-gnu/libQtCore.so.4(+0x1a9b24)[0x7fbf35558b24]
/lib/x86_64-linux-gnu/libglib-2.0.so.0(g_main_context_check+0x183)[0x7fbf33db1a33]
/lib/x86_64-linux-gnu/libglib-2.0.so.0(+0x47f96)[0x7fbf33db1f96]
/lib/x86_64-linux-gnu/libglib-2.0.so.0(g_main_context_iteration+0x34)[0x7fbf33db2124]
/usr/lib/x86_64-linugnu-libQtCore.so.4(_ZN20QEventDispatcherGlib13processEventsE6QFlagsIN10QEventLoop17ProcessEven    tsFlagEE+0xd6)[0x7fbf35559426]
/usr/lib/x86_64-linux-gnu/libQtCore.so.4(_ZN10QEventLoop13processEventsE6QFlagsINS_17ProcessEventsFlagEE+0x32)       [0x7fbf35528c82]
/usr/lib/x86_64-linux-gnu/libQtCore.so.4(_ZN10QEventLoop4execE6QFlagsINS_17ProcessEventsFlagEE+0xf7)      [0x7fbf35528ed7]
  /usr/lib/x86_64-linux-gnu/libQtCore.so.4(_ZN16QCoreApplication4execEv+0x87)[0x7fbf3552df67]
  ./collector(main+0x216)[0x4234c6]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7fbf348e076d]

我用valgrind分析了它,並說:

==31981== Conditional jump or move depends on uninitialised value(s)
==31981==    at 0x556AB14: ??? (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x6C2AA32: g_main_context_check (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.1)
==31981==    by 0x6C2AF95: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.1)
==31981==    by 0x6C2B123: g_main_context_iteration (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.1)
==31981==    by 0x556B3BE: QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x553AC81: QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x553AED6: QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x553FF66: QCoreApplication::exec() (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x4234C5: main (main.cpp:170)
==31981==
==31981== Invalid read of size 2
==31981==    at 0x556AB45: ??? (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x6C2AA32: g_main_context_check (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.1)
==31981==    by 0x6C2AF95: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.1)
==31981==    by 0x6C2B123: g_main_context_iteration (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.1)
==31981==    by 0x556B3BE: QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x553AC81: QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x553AED6: QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x553FF66: QCoreApplication::exec() (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x4234C5: main (main.cpp:170)
==31981==  Address 0xa8bf0c6 is 6 bytes inside a block of size 16 free'd
==31981==    at 0x4C2A4BC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==31981==    by 0x556AB44: ??? (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x6C2AA32: g_main_context_check (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.1)
==31981==    by 0x6C2AF95: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.1)
==31981==    by 0x6C2B123: g_main_context_iteration (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.1)
==31981==    by 0x556B3BE: QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x553AC81: QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x553AED6: QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x553FF66: QCoreApplication::exec() (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x4234C5: main (main.cpp:170)

==31981==
==31981== Invalid read of size 2
==31981==    at 0x556AB4D: ??? (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x6C2AA32: g_main_context_check (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.1)
==31981==    by 0x6C2AF95: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.1)
==31981==    by 0x6C2B123: g_main_context_iteration (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.1)
==31981==    by 0x556B3BE: QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x553AC81: QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x553AED6: QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x553FF66: QCoreApplication::exec() (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x4234C5: main (main.cpp:170)
==31981==  Address 0xa8bf0c4 is 4 bytes inside a block of size 16 free'd
==31981==    at 0x4C2A4BC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==31981==    by 0x556AB44: ??? (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x6C2AA32: g_main_context_check (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.1)
==31981==    by 0x6C2AF95: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.1)
==31981==    by 0x6C2B123: g_main_context_iteration (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.1)
==31981==    by 0x556B3BE: QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x553AC81: QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x553AED6: QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x553FF66: QCoreApplication::exec() (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x4234C5: main (main.cpp:170)

==31981==
==31981== Thread 2:
==31981== Invalid write of size 2
==31981==    at 0x6C281FA: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.1)
==31981==    by 0x6C291D1: g_source_add_poll (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.1)
==31981==    by 0x556B7A9: QEventDispatcherGlib::registerSocketNotifier(QSocketNotifier*) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x5145E59: QUdpSocket::readDatagram(char*, long long, QHostAddress*, unsigned short*) (in /usr/lib/x86_64-linux-gnu/libQtNetwork.so.4.8.1)
==31981==    by 0x4205F1: LogReceiver::receiveLog() (udpSocket.cpp:52)
==31981==    by 0x42B630: LogReceiver::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) (moc_udpSocket.cpp:54)
==31981==    by 0x5555445: QObject::event(QEvent*) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x553BE9B: QCoreApplication::notifyInternal(QObject*, QEvent*) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x553FC69: QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x556AF92: ??? (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x6C2AC99: g_main_context_dispatch (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.1)
==31981==    by 0x6C2B05F: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.1)
==31981==  Address 0xa8bf0c6 is 6 bytes inside a block of size 16 free'd
==31981==    at 0x4C2A4BC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==31981==    by 0x556AB44: ??? (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x6C2AA32: g_main_context_check (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.1)
==31981==    by 0x6C2AF95: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.1)
==31981==    by 0x6C2B123: g_main_context_iteration (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.1)
==31981==    by 0x556B3BE: QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x553AC81: QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x553AED6: QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x553FF66: QCoreApplication::exec() (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1)
==31981==    by 0x4234C5: main (main.cpp:170)

我分析了程序,並刪除了所有我不知道是Qt還是ubuntu還是GCC還是我的錯誤的錯誤。

此外,我想知道是否有人每秒嘗試20個以上事件的系統應用程序。 一段時間后崩潰。

謝謝大家。

SocketNotifier實現不是線程安全的。 這意味着不允許您從其他線程控制它。

如果您在沒有QT_NO_DEBUG的情況下編譯了Qt,則會收到警告,提示您可以從其他線程控制它:

void QEventDispatcherGlib::unregisterSocketNotifier(QSocketNotifier *notifier)
{
    Q_ASSERT(notifier);
#ifndef QT_NO_DEBUG
    int sockfd = notifier->socket();
    if (sockfd < 0) {
        qWarning("QSocketNotifier: Internal error");
        return;
    } else if (notifier->thread() != thread()
               || thread() != QThread::currentThread()) {
        qWarning("QSocketNotifier: socket notifiers cannot be disabled from another thread");
        return;
    }   
#endif
//....
}

請檢查是否已將對象的所有成員(移到線程中)創建為該對象的子對象。 或者只是關閉QT_NO_DEBUG。

順便說一句:我為類似的問題而苦苦掙扎,使用數小時后出現了崩潰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM