【发布时间】:2014-10-01 22:46:39
【问题描述】:
我们的应用程序仅在 Apache 下的 RHEL6 上运行时才会崩溃(即使以 httpd -X 独立启动)。当使用自定义小型 http 服务器或在另一台装有 Ubuntu 的机器上运行时,它可以正常工作。
这是堆栈跟踪:
Program received signal SIGSEGV, Segmentation fault.
0x00007fffe8f96d9f in ?? () from /opt/QtSDK/Desktop/Qt/4.8.1/gcc/lib/libQtCore.so.4
(gdb) bt
#0 0x00007fffe8f96d9f in ?? () from /opt/QtSDK/Desktop/Qt/4.8.1/gcc/lib/libQtCore.so.4
#1 0x00007fffe8f93a39 in QThread::currentThread() () from /opt/QtSDK/Desktop/Qt/4.8.1/gcc/lib/libQtCore.so.4
#2 0x00007fffe90a05bc in QCoreApplicationPrivate::QCoreApplicationPrivate(int&, char**, unsigned int) ()
from /opt/QtSDK/Desktop/Qt/4.8.1/gcc/lib/libQtCore.so.4
#3 0x00007fffe7cbec63 in QApplicationPrivate::QApplicationPrivate(int&, char**, QApplication::Type, int) ()
from /opt/QtSDK/Desktop/Qt/4.8.1/gcc/lib/libQtGui.so.4
#4 0x00007fffe7cc811c in QApplication::QApplication(int&, char**, int) () from /opt/QtSDK/Desktop/Qt/4.8.1/gcc/lib/libQtGui.so.4
互联网上有几个类似的问题,但没有一个列出任何答案:
- https://trac.videolan.org/vlc/ticket/8616
- https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=675373
- https://www.virtualbox.org/ticket/12923?cversion=0&cnum_hist=5
根据Qt源码,我认为QThreadData::current()返回NULL。但是为什么会这样呢?
现在,我通过反汇编发现__get_tls_addr 返回 0(我想是 Qt 静态线程数据变量)。现在,当我运行自定义 http 服务器而不是 apache 时,__get_tls_addr 确实返回了有效指针。
我发现如果我将-ftls-model=initial-exec 更改为-ftls-model=global-dynamic,那么它可以在 RHEL/apache 中使用。我仍然不明白的是为什么,关于 apache 的具体情况。
【问题讨论】:
-
既然这是一个服务器应用程序,为什么你使用
QApplication而不是QCoreApplication? -
使用 QCoreApplication 它会以同样的方式崩溃。
-
明白。这仍然不会改变您应该使用
QCoreApplication的事实。在没有 DISPLAY 的 Linux 主机上启动的QApplication会抱怨,并且 IIRC 会在启动时死掉。最不幸的情况。 -
您应该发布最后两段作为您问题的答案:)
-
也许吧,但这不是答案,只是一种解决方法,除非我知道为什么以及我在做什么。