我们的应用程序仅在 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 static threaddata var)。现在,当我运行自定义 http 服务器而不是 apache 时,__get_tls_addr
确实返回有效的指针。
我发现如果我将 -ftls-model=initial-exec
更改为 -ftls-model=global-dynamic
那么它可以在 RHEL/apache 中工作。我仍然不明白的是为什么,apache 有什么具体之处。
最佳答案
initial-exec
和 local-exec
模型仅对通过 exec
启动的应用程序有意义。如果模块不是主模块而是库,事情就会失败。但他们确实失败了。
您发现,从库中使用 TLS 需要一组与构建独立可执行文件时不同的标志。人们希望 qmake mkspecs 能够在相关编译器上解决这一问题......
关于linux - RHEL/apache 上的 QApplication/QThread 崩溃(__get_tls_addr 返回 0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25203763/