当我使用QProcess或popen时,为什么我的Qt应用程序会锁定?

时间:2014-03-27 19:01:23

标签: qt fork

我的Qt应用程序在正确运行几个小时后锁定了高CPU使用率,我正在试图找出原因。这是在嵌入式Linux系统上。

我做的第一件事是附加gdb并查看堆栈回溯。它显示了在ptmalloc_lock_all()中发生的锁定,它由fork()调用。该应用程序使用system()播放视频,并定期使用QProcess检查是否已安装USB驱动器。

我不是故意在我的应用程序中使用多个线程,但gdb在冻结发生时显示4个线程。我已经为所有4个线程包含了回溯:

(gdb) thread apply all backtrace

Thread 4 (Thread 995):
#0  0x4282dc50 in select () from /opt/filesys/fs/lib/libc.so.6
#1  0x4246a768 in qt_safe_select(int, fd_set*, fd_set*, fd_set*, timeval const*) ()
   from /opt/filesys/fs/opt/filesys/fs/opt/qt/lib/libQtCore.so.4
#2  0x4246f2a8 in QEventDispatcherUNIXPrivate::doSelect(QFlags<QEventLoop::ProcessEventsFlag>, timeval*) ()
   from /opt/filesys/fs/opt/filesys/fs/opt/qt/lib/libQtCore.so.4
#3  0x4246f6e0 in QEventDispatcherUNIX::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) ()
   from /opt/filesys/fs/opt/filesys/fs/opt/qt/lib/libQtCore.so.4
#4  0x42435898 in QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) ()
   from /opt/filesys/fs/opt/filesys/fs/opt/qt/lib/libQtCore.so.4
#5  0x42435bac in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) ()
   from /opt/filesys/fs/opt/filesys/fs/opt/qt/lib/libQtCore.so.4
#6  0x42317834 in QThread::exec() ()
   from /opt/filesys/fs/opt/filesys/fs/opt/qt/lib/libQtCore.so.4
#7  0x4231aaf8 in ?? ()
   from /opt/filesys/fs/opt/filesys/fs/opt/qt/lib/libQtCore.so.4
Cannot access memory at address 0x0
#8  0x4231aaf8 in ?? ()
   from /opt/filesys/fs/opt/filesys/fs/opt/qt/lib/libQtCore.so.4
Cannot access memory at address 0x0
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

Thread 3 (Thread 973):
#0  0x425c64bc in pthread_cond_wait@@GLIBC_2.4 () from /opt/filesys/fs/lib/libpthread.so.0
#1  0x413f8688 in ?? ()
   from /opt/filesys/fs/opt/filesys/fs/opt/qt/lib/libQtWebKit.so.4
Cannot access memory at address 0x0
#2  0x413f8688 in ?? ()
   from /opt/filesys/fs/opt/filesys/fs/opt/qt/lib/libQtWebKit.so.4
Cannot access memory at address 0x0
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

Thread 2 (Thread 949):
#0  0x4282dc50 in select () from /opt/filesys/fs/lib/libc.so.6
#1  0x4240c16c in ?? ()
   from /opt/filesys/fs/opt/filesys/fs/opt/qt/lib/libQtCore.so.4
Cannot access memory at address 0x3054
#2  0x4240c16c in ?? ()
   from /opt/filesys/fs/opt/filesys/fs/opt/qt/lib/libQtCore.so.4
Cannot access memory at address 0x3054
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

Thread 1 (Thread 720):
#0  0x427e1194 in ptmalloc_lock_all () from /opt/filesys/fs/lib/libc.so.6
#1  0x428041c4 in fork () from /opt/filesys/fs/lib/libc.so.6
#2  0x4240fce8 in ?? ()
   from /opt/filesys/fs/opt/filesys/fs/opt/qt/lib/libQtCore.so.4
#3  0x4240fce8 in ?? ()
   from /opt/filesys/fs/opt/filesys/fs/opt/qt/lib/libQtCore.so.4
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

我对多线程编程不是很熟悉,但是通过在线阅读,听起来在多线程应用程序中使用fork()会很危险。我不知道该做什么作为替代方案。

非常感谢任何输入!

马龙

0 个答案:

没有答案