Linux RHEL/apache上的QApplication/QThread崩溃(\uuu get\u tls\u addr返回0)
我们的应用程序只有在apache下的RHEL6上运行时才会崩溃(即使是作为httpd-X独立启动)。当使用自定义小型http服务器或在另一台Ubuntu机器下运行时,它工作正常 以下是堆栈跟踪:Linux RHEL/apache上的QApplication/QThread崩溃(\uuu get\u tls\u addr返回0),linux,apache,qt,rhel,Linux,Apache,Qt,Rhel,我们的应用程序只有在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 0x
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
互联网上有几个类似的问题,但都没有列出任何答案:
QThreadData::current()
返回NULL。但为什么会发生这种情况
现在,我通过反汇编发现,\uu get\u tls\u addr
返回0(我想对于Qt静态threaddata变量)。现在,当我运行自定义http服务器而不是apache时,\uu get\u tls\u addr
会返回有效的指针
我发现如果我将
-ftls model=initial exec
更改为-ftls model=global dynamic
,那么它在RHEL/apache中工作。我仍然不明白的是为什么,apache的具体功能是什么。初始exec和本地exec
模型只对以exec
开头的应用程序有意义。如果模块不是主模块,而是库,那么事情就应该失败。他们确实失败了
您发现,从库中使用TLS与构建独立可执行文件时使用不同的标志集。有人希望qmake mkspecs能够在相关编译器上处理这些问题
请参阅。仅当应用程序以
exec
'd启动时,initial exec
和local exec
模型才有意义。如果模块不是主模块,而是库,那么事情就应该失败。他们确实失败了
您发现,从库中使用TLS与构建独立可执行文件时使用不同的标志集。有人希望qmake mkspecs能够在相关编译器上处理这些问题
请参阅。既然这是一个服务器应用程序,为什么要使用
QApplication
而不是QCoreApplication
?对于QCoreApplication,它会以同样的方式崩溃。明白。这仍然不能改变您应该使用QCoreApplication
的事实。在没有显示器的Linux主机上启动的QApplication
会发出抱怨,IIRC会在启动时死亡。最不幸的情况。你应该发布最后两段作为你问题的答案:)也许,但这不是答案,只是一个解决办法,除非我知道原因和我在做什么。因为这是一个服务器应用程序,为什么使用QApplication
而不是QCoreApplication
?对于QCoreApplication,它会以同样的方式崩溃。明白。这仍然不能改变您应该使用QCoreApplication
的事实。在没有显示器的Linux主机上启动的QApplication
会发出抱怨,IIRC会在启动时死亡。最不幸的情况。你应该把最后两段作为你问题的答案:)也许吧,但这不是答案,只是一个解决办法,除非我知道我为什么和我在做什么。这很有趣。我将尝试了解更多有关这方面的信息,但如果您提供更多详细信息的链接,我将非常高兴。我应该从“线程本地存储的ELF处理”开始吗?接受,尽管我将进行更多的研究。这很有趣。我将尝试了解更多有关这方面的信息,但如果您提供更多详细信息的链接,我将非常高兴。我应该从“线程本地存储的ELF处理”开始吗?尽管我将要进行更多的研究,但还是接受它。