Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-126134

Restarting multiple QThreads results in a crash

    XMLWordPrintable

Details

    • Bug
    • Resolution: Unresolved
    • P2: Important
    • 6.8
    • 6.9
    • Core: Threads
    • None
    • Linux/X11, Windows

    Description

      The original bug report can be found in the forum: https://forum.qt.io/topic/157098

      I've encountered a strange crash issue. We have some worker objects, each with it's own thread (HAS-A). Periodically, we are encountering a crash when the objects thread is restarted.

      A testcase is attached, I tested it with MSVC2022 (win 64bit) and gcc13 (linux 64bit). Debugging did not gave me any hints, neither on windows nor linux. It seems to have something to do with objectName() - as soon as I remove/replace it (attn: 'this' also accesses the objectName property) the crash is gone.
      valgrind is not very helpful for me:

      ==7402== Thread 6 QThread:
      ==7402== Invalid read of size 8
      ==7402==    at 0x4A4296F: value (qproperty_p.h:571)
      ==7402==    by 0x4A4296F: operator QObjectCompatProperty<QObjectPrivate::ExtraData, QString, QObjectPrivate::ExtraData::_qt_property_objectName_offset, &QObjectPrivate::ExtraData::setObjectNameForwarder, &QObjectPrivate::ExtraData::nameChangedForwarder>::parameter_type (qproperty_p.h:595)
      ==7402==    by 0x4A4296F: QObject::objectName() const (qobject.cpp:1287)
      ==7402==    by 0x4A447E6: QObjectPrivate::writeToDebugStream(QDebug&) const (qobject.cpp:4476)
      ==7402==    by 0x4A43C92: operator<<(QDebug, QObject const*) (qobject.cpp:4488)
      ==7402==    by 0x10E6BA: SimpleWorkerThread::onThreadFinished() (simpleworkerthread.cpp:35)
      ==7402==    by 0x10ED5A: QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, void (SimpleWorkerThread::*)()>::call(void (SimpleWorkerThread::*)(), SimpleWorkerThread*, void**)::{lambda()#1}::operator()() const (qobjectdefs_impl.h:153)
      ==7402==    by 0x10EE6F: void QtPrivate::FunctorCallBase::call_internal<void, QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, void (SimpleWorkerThread::*)()>::call(void (SimpleWorkerThread::*)(), SimpleWorkerThread*, void**)::{lambda()#1}>(void**, QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, void (SimpleWorkerThread::*)()>::call(void (SimpleWorkerThread::*)(), SimpleWorkerThread*, void**)::{lambda()#1}&&) (qobjectdefs_impl.h:72)
      ==7402==    by 0x10EDBB: QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, void (SimpleWorkerThread::*)()>::call(void (SimpleWorkerThread::*)(), SimpleWorkerThread*, void**) (qobjectdefs_impl.h:152)
      ==7402==    by 0x10ECDB: void QtPrivate::FunctionPointer<void (SimpleWorkerThread::*)()>::call<QtPrivate::List<>, void>(void (SimpleWorkerThread::*)(), SimpleWorkerThread*, void**) (qobjectdefs_impl.h:200)
      ==7402==    by 0x10EC1C: QtPrivate::QCallableObject<void (SimpleWorkerThread::*)(), QtPrivate::List<>, void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) (qobjectdefs_impl.h:571)
      ==7402==    by 0x4A51F79: call (qobjectdefs_impl.h:487)
      ==7402==    by 0x4A51F79: void doActivate<false>(QObject*, int, void**) (qobject.cpp:4113)
      ==7402==    by 0x4B048E0: QThread::finished(QThread::QPrivateSignal) (moc_qthread.cpp:201)
      ==7402==    by 0x4BA2334: operator() (qthread_unix.cpp:355)
      ==7402==    by 0x4BA2334: terminate_on_exception<QThreadPrivate::finish(void*)::<lambda()> > (qthread_unix.cpp:264)
      ==7402==    by 0x4BA2334: QThreadPrivate::finish(void*) (qthread_unix.cpp:345)
      ==7402==  Address 0x8e49648 is not stack'd, malloc'd or (recently) free'd
      ==7402== 
      ==7402== 
      ==7402== Process terminating with default action of signal 11 (SIGSEGV): dumping core
      ==7402==  Access not within mapped region at address 0x8E49648
      ==7402==    at 0x4A4296F: value (qproperty_p.h:571)
      ==7402==    by 0x4A4296F: operator QObjectCompatProperty<QObjectPrivate::ExtraData, QString, QObjectPrivate::ExtraData::_qt_property_objectName_offset, &QObjectPrivate::ExtraData::setObjectNameForwarder, &QObjectPrivate::ExtraData::nameChangedForwarder>::parameter_type (qproperty_p.h:595)
      ==7402==    by 0x4A4296F: QObject::objectName() const (qobject.cpp:1287)
      ==7402==    by 0x4A447E6: QObjectPrivate::writeToDebugStream(QDebug&) const (qobject.cpp:4476)
      ==7402==    by 0x4A43C92: operator<<(QDebug, QObject const*) (qobject.cpp:4488)
      ==7402==    by 0x10E6BA: SimpleWorkerThread::onThreadFinished() (simpleworkerthread.cpp:35)
      ==7402==    by 0x10ED5A: QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, void (SimpleWorkerThread::*)()>::call(void (SimpleWorkerThread::*)(), SimpleWorkerThread*, void**)::{lambda()#1}::operator()() const (qobjectdefs_impl.h:153)
      ==7402==    by 0x10EE6F: void QtPrivate::FunctorCallBase::call_internal<void, QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, void (SimpleWorkerThread::*)()>::call(void (SimpleWorkerThread::*)(), SimpleWorkerThread*, void**)::{lambda()#1}>(void**, QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, void (SimpleWorkerThread::*)()>::call(void (SimpleWorkerThread::*)(), SimpleWorkerThread*, void**)::{lambda()#1}&&) (qobjectdefs_impl.h:72)
      ==7402==    by 0x10EDBB: QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, void (SimpleWorkerThread::*)()>::call(void (SimpleWorkerThread::*)(), SimpleWorkerThread*, void**) (qobjectdefs_impl.h:152)
      ==7402==    by 0x10ECDB: void QtPrivate::FunctionPointer<void (SimpleWorkerThread::*)()>::call<QtPrivate::List<>, void>(void (SimpleWorkerThread::*)(), SimpleWorkerThread*, void**) (qobjectdefs_impl.h:200)
      ==7402==    by 0x10EC1C: QtPrivate::QCallableObject<void (SimpleWorkerThread::*)(), QtPrivate::List<>, void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) (qobjectdefs_impl.h:571)
      ==7402==    by 0x4A51F79: call (qobjectdefs_impl.h:487)
      ==7402==    by 0x4A51F79: void doActivate<false>(QObject*, int, void**) (qobject.cpp:4113)
      ==7402==    by 0x4B048E0: QThread::finished(QThread::QPrivateSignal) (moc_qthread.cpp:201)
      ==7402==    by 0x4BA2334: operator() (qthread_unix.cpp:355)
      ==7402==    by 0x4BA2334: terminate_on_exception<QThreadPrivate::finish(void*)::<lambda()> > (qthread_unix.cpp:264)
      ==7402==    by 0x4BA2334: QThreadPrivate::finish(void*) (qthread_unix.cpp:345)
      

      Attachments

        1. threads.7z
          2 kB
          Christian Ehrlicher
        No reviews matched the request. Check your Options in the drop-down menu of this sections header.

        Activity

          People

            fabiankosmale Fabian Kosmale
            chehrlic Christian Ehrlicher
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

            Dates

              Created:
              Updated:

              Gerrit Reviews

                There are no open Gerrit changes