我正在运行Qt程序初始化中的间歇性死锁,而它在相对空闲且在事件循环中。
我通过使用strace确认这是一个futex_wait,我总是在主线程中看到这样的条目: [pid 1768] futex(0x7f28f400aecc,FUTEX_WAIT_PRIVATE,1,NULL
我发现我可以添加一个Qt事件过滤器,因此在从主线程处理事件时记录事件。这是一个片段:
bool ActivityEventFilter::eventFilter(QObject *obj, QEvent *ev){
VLOG(5) << "inspecting event " << obj << " name " << obj->objectName().toStdString() << " class " << obj->metaObject()->className() << " eventType " << ev->type();
if (VLOG_IS_ON(5))
{
if (ev->type() == QEvent::MetaCall)
{
if (QString(obj->metaObject()->className()).contains("QDBusConnectionPrivate")
{
VLOG(5) << "Dumping object data";
obj->dumpObjectInfo();
obj->dumpObjectTree();
}
}
}
...
}
在检查我的记录时,冻结总是在这些行之前:
I0614 17:18:27.928889 1812 ActivityEventFilter.cpp:19] inspecting event 0x7fde200144c0 name class QDBusConnectionPrivate eventType 43
I0614 17:18:27.928901 1812 ActivityEventFilter.cpp:28] Dumping object data
对象信息或对象树中没有输出。
我没有在我的应用程序中的任何地方有意识地使用DBus,所以我希望找到一种方法来追踪谁在调用它以查看是否可以防止它,但是没有objectInfo,我不知道在哪里开始。
我发现了两个Qt错误报告: https://bugreports.qt.io/browse/QTBUG-42189
https://bugreports.qt.io/browse/QTBUG-51648
第一个看起来像问题,但似乎所有的决议都进入了Qt 5.4.0。 (我正在使用Qt 5.4.1) 第二个看起来有点不同。