为啥我的 C++/QT 应用程序在 Linux x86_64 上的 nanosleep() 中崩溃?

Posted

技术标签:

【中文标题】为啥我的 C++/QT 应用程序在 Linux x86_64 上的 nanosleep() 中崩溃?【英文标题】:Why my C++/QT application crashes in nanosleep() on Linux x86_64?为什么我的 C++/QT 应用程序在 Linux x86_64 上的 nanosleep() 中崩溃? 【发布时间】:2012-12-19 07:06:22 【问题描述】:

我在 x86_64 上的 Ubuntu 12.10 下运行用 Qt/C++ 编写的服务器端 webkit 渲染器。 Qt 是定制的 4.8.4 以及 qtwebkit 2.3。

在大约 5% 的渲染任务中,应用程序会这样崩溃(gdb 日志):

This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/something...done.
[New LWP 27328]
[New LWP 27825]
[New LWP 27807]
[New LWP 28981]
[New LWP 27808]
[New LWP 28387]
[New LWP 28575]
[New LWP 28837]
[New LWP 28879]
[New LWP 28891]
[New LWP 27326]
[New LWP 28420]
[New LWP 28681]

warning: Can't read pathname for load map: Input/output error.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `/home/something'.
Program terminated with signal 11, Segmentation fault.
#0  0x00007f793a58183d in nanosleep () at ../sysdeps/unix/syscall-template.S:82
82  ../sysdeps/unix/syscall-template.S: No such file or directory.
#0  0x00007f793a58183d in nanosleep () at ../sysdeps/unix/syscall-template.S:82
#1  0x00007f793a5816dc in __sleep (seconds=0) at ../sysdeps/unix/sysv/linux/sleep.c:138
#2  0x00007f793db80014 in ?? () from /usr/local/qt-4.8.4-git/lib/libQtWebKit.so.4
#3  0x00007f793db80309 in ?? () from /usr/local/qt-4.8.4-git/lib/libQtWebKit.so.4
#4  0x00007f793b09de9a in start_thread (arg=0x7f7934b41700) at pthread_create.c:308
#5  0x00007f793a5b5cbd in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112
#6  0x0000000000000000 in ?? ()
(gdb) quit

这怎么可能?我能做些什么来减轻这种崩溃?

更新:此处其他线程的回溯:http://pastie.org/5623164

【问题讨论】:

其他线程的堆栈跟踪是什么样的? 我也没有看到任何有用的东西:pastie.org/5623164 您尚未发布sscce,因此我们无能为力。你试过在 valgrind 下运行吗? 无法提供测试用例。我在服务器上运行了大约 2,000 个这个(巨大的)软件实例,每个实例每五分钟重生一次。我在随机时间遇到大约 2% 的崩溃,没有明显的再现模式。当然,我在这个应用程序上多次尝试 valgrind,但在我的代码中没有发现明显的漏洞。 我不确定我是否信任 gdb 的输出...我已经看到报告的堆栈跟踪与实际崩溃的原因没有太大关系的情况(或者因为它是错误线程的堆栈跟踪,或者因为内存被充分利用以至于 gdb 感到困惑)。我会尝试为所有对 sleep() 的调用获取 Qt 源文件,并在每个调用之前放置一个 printf() (或任何你喜欢的调试函数),看看 Qt 是否甚至调用 sleep() 或 nanosleep()全部...我不知道为什么它会出现在您的应用程序中。 【参考方案1】:

事实证明,这是一个错误的回溯。在用相同的构建但使用调试符号替换 libQtWebKit 后,我​​得到了一个完全不同的回溯,这很有意义。

tl;dr - nanosleep() 中没有崩溃,这只是 gdb 的错误解析。

【讨论】:

以上是关于为啥我的 C++/QT 应用程序在 Linux x86_64 上的 nanosleep() 中崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Qt 应用程序在执行时不显示 GUI?

Linux Mint (应用软件:QT 5.X编译错误)

为啥我不能正常使用qt在linux中编程

在linux2.6内核中为啥找不到inet

为啥我的 Qt 应用程序在计算机上请求 msvcp120d.dll 而不是我的

为啥 Qt 中的 MainWindow 在启动程序后关闭?