내가 QT 소켓에 신호 슬롯이있는 시스템 응용 프로그램을 개발하고, 우분투 QT QCoreApplication :: 간부() 우분투에 충돌 12.04
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에서 두 번째 방사를 생략하면 문제는 해결되지 않지만 나중에 프로그램이 충돌합니다. 그러나 그것은 사라지지 않습니다. 1 ~ 2 분 후에 깨집니다. 프로그램은 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 버그 또는 우분투 버그 또는 GCC 또는 내 잘못.
게다가 아무도 초당 20 개 이상의 이벤트가있는 시스템 응용 프로그램을 사용해 본지 알고 싶었습니다. 잠시 후 충돌이 발생합니다.
감사합니다.
디버거를 사용하면 어떤 선이 충돌합니까? – cmannett85
그것은 우분투와 관련이 없으며 centos에서 모두 충돌합니다. 그것은 QCoreApplication :: exec()에서 간접적으로 호출되는 poll() 함수에있다. – mehran
@mehran :'thread.start()'를 호출합니까? – Mehrwolf