如何在Qt事件处理程序中调试互斥锁死锁(QDBusConnectionPrivate)

时间:2017-06-14 22:16:42

标签: c++ qt

我正在运行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) 第二个看起来有点不同。

0 个答案:

没有答案