【问题标题】:Crash in QApplication/QThread on RHEL / apache (__get_tls_addr returns 0)RHEL / apache 上的 QApplication/QThread 崩溃(__get_tls_addr 返回 0)
【发布时间】: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

互联网上有几个类似的问题,但没有一个列出任何答案:

根据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 会在启动时死掉。最不幸的情况。
  • 您应该发布最后两段作为您问题的答案:)
  • 也许吧,但这不是答案,只是一种解决方法,除非我知道为什么以及我在做什么。

标签: linux apache qt rhel


【解决方案1】:

initial-execlocal-exec 模型仅适用于以 exec'd 开头的应用程序。如果模块不是主模块,而是库,那么事情应该会失败。他们失败了。

您发现,使用库中的 TLS 与构建独立可执行文件时需要一组不同的标志。希望 qmake mkspecs 能够在相关编译器上解决这个问题...

the tls-model attribute reference

【讨论】:

  • 这很有趣。我会尝试了解更多有关此内容的信息,但如果您提供包含更多详细信息的链接,我会很高兴。我应该从“线程本地存储的 ELF 处理”开始吗?
  • 接受,即使我要研究更多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 2023-01-30
相关资源
最近更新 更多