Skip to content

Create QML engine in SidebarMode

Fushan Wen requested to merge work/fuf/nocrash into master

The global static objects in QAccessible might already be destroyed before the engine is destroyed, and some quick elements (e.g. QQuickControl) will call QAccessible::removeActivationObserver in their dtor, which can cause a crash when there are any singleton QML objects in the engine (e.g. TextFieldContextMenu).

By creating the engine in SidebarMode, the engine can be destroyed before the global list in QAccessible is destroyed, so the crash can be avoided.

Backtrace:

 @0  QtPrivate::sequential_erase_if<QList<QAccessible::ActivationObserver*>, QtPrivate::sequential_erase<QList<QAccessible::ActivationObserver*>, QAccessible::ActivationObserver*>(QList<QAccessible::ActivationObserver*>&, QAccessible::ActivationObserver* const&)::{lambda(auto:1&) @1}>(QList<QAccessible::ActivationObserver*>&, QtPrivate::sequential_erase<QList<QAccessible::ActivationObserver*>, QAccessible::ActivationObserver*>(QList<QAccessible::ActivationObserver*>&, QAccessible::ActivationObserver* const&)::{lambda(auto:1&) @1}&)
    (c=..., pred=...)
    at /home/qydw/kde/src/qtbase/src/corelib/tools/qcontainertools_impl.h:338
 @1  0x00007ffff4841c6c in QtPrivate::sequential_erase<QList<QAccessible::ActivationObserver*>, QAccessible::ActivationObserver*>(QList<QAccessible::ActivationObserver*>&, QAccessible::ActivationObserver* const&)
    (c=<optimized out>, t=@0x7fffffffd298: 0x2d62670)
    at /home/qydw/kde/src/qtbase/src/corelib/tools/qcontainertools_impl.h:372
 @2  0x00007ffff4841c87 in QtPrivate::sequential_erase_with_copy<QList<QAccessible::ActivationObserver*>, QAccessible::ActivationObserver*>(QList<QAccessible::ActivationObserver*>&, QAccessible::ActivationObserver* const&)
    (c=<optimized out>, t=@0x7fffffffd2b8: 0x2d62670)
    at /home/qydw/kde/src/qtbase/src/corelib/tools/qcontainertools_impl.h:380
 @3  0x00007ffff483da9a in QList<QAccessible::ActivationObserver*>::removeAll<QAccessible::ActivationObserver*>(QAccessible::ActivationObserver* const&)
    (t=@0x7fffffffd2b8: 0x2d62670, this=<optimized out>)
    at /home/qydw/kde/src/qtbase/src/corelib/tools/qlist.h:594
 @4  QAccessible::removeActivationObserver(QAccessible::ActivationObserver*)
    (observer=<optimized out>, observer@entry=0x2d62670)
    at /home/qydw/kde/src/qtbase/src/gui/accessible/qaccessible.cpp:634
 @5  0x00007ffff04f367a in QQuickControl::~QQuickControl()
    (this=this@entry=0xfe02b0, __in_chrg=<optimized out>)
    at /home/qydw/kde/src/qtdeclarative/src/quicktemplates/qquickcontrol.cpp:926
 @6  0x00007ffff050df67 in QQuickPane::~QQuickPane()
    (this=this@entry=0xfe02b0, __in_chrg=<optimized out>)
    at /home/qydw/kde/src/qtdeclarative/src/quicktemplates/qquickpane.cpp:264
 @7  0x00007ffff050bdd7 in QQuickPage::~QQuickPage()
    (this=this@entry=0xfe02b0, __in_chrg=<optimized out>)
    at /home/qydw/kde/src/qtdeclarative/src/quicktemplates/qquickpage.cpp:225
 @8  0x00007ffff0517f66 in QQuickPopupItem::~QQuickPopupItem()
    (this=0xfe02b0, __in_chrg=<optimized out>)
    at /home/qydw/kde/src/qtdeclarative/src/quicktemplates/qquickpopupitem_p_p.h:26
 @9  QQuickPopupItem::~QQuickPopupItem()
    (this=0xfe02b0, __in_chrg=<optimized out>)
    at /home/qydw/kde/src/qtdeclarative/src/quicktemplates/qquickpopupitem_p_p.h:26
 @10 0x00007ffff05140ca in QQuickPopup::~QQuickPopup()
    (this=this@entry=0x159f410, __in_chrg=<optimized out>)
    at /home/qydw/kde/src/qtdeclarative/src/quicktemplates/qquickpopup.cpp:1072
 @11 0x00007ffff057b2ce in QQuickMenu::~QQuickMenu()
    (this=this@entry=0x159f410, __in_chrg=<optimized out>)
    at /home/qydw/kde/src/qtdeclarative/src/quicktemplates/qquickmenu.cpp:758
 @12 0x00007ffff054fdc2 in QQmlPrivate::QQmlElement<QQuickMenu>::~QQmlElement() (this=0x159f410, __in_chrg=<optimized out>)
    at /home/qydw/kde/src/qtdeclarative/src/qml/qml/qqmlprivate.h:100
 @13 0x00007ffff054fdd3 in QQmlPrivate::QQmlElement<QQuickMenu>::~QQmlElement() (this=0x159f410, __in_chrg=<optimized out>)
    at /home/qydw/kde/src/qtdeclarative/src/qml/qml/qqmlprivate.h:100
 @14 0x00007ffff50ccee4 in QQmlEnginePrivate::SingletonInstances::clear()
    (this=this@entry=0x88ae48)
    at /home/qydw/kde/src/qtdeclarative/src/qml/qml/qqmlengine_p.h:282
 @15 0x00007ffff50c7a4d in QQmlEngine::~QQmlEngine()
    (this=0x9a9930, __in_chrg=<optimized out>)
    at /home/qydw/kde/src/qtdeclarative/src/qml/qml/qqmlengine.cpp:560
 @16 0x00007ffff50c7a8f in QQmlEngine::~QQmlEngine()
    (this=0x9a9930, __in_chrg=<optimized out>)
    at /home/qydw/kde/src/qtdeclarative/src/qml/qml/qqmlengine.cpp:566
 @17 0x00007ffff7f83b08 in std::_Sp_counted_ptr<QQmlEngine*, (__gnu_cxx::_Lock_policy)2>::_M_dispose() (this=0x823f10)
    at /usr/include/c++/13/bits/shared_ptr_base.h:428
 @18 0x00007ffff7f82e8b in std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release() (this=0x823f10) at /usr/include/c++/13/bits/shared_ptr_base.h:346
 @19 0x00007ffff7f831dd in std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count() (this=0x841f78, __in_chrg=<optimized out>)
    at /usr/include/c++/13/bits/shared_ptr_base.h:1071
 @20 0x00007ffff7f82fde in std::__shared_ptr<QQmlEngine, (__gnu_cxx::_Lock_policy)2>::~__shared_ptr() (this=0x841f70, __in_chrg=<optimized out>)
    at /usr/include/c++/13/bits/shared_ptr_base.h:1524
 @21 0x00007ffff7f82ffa in std::shared_ptr<QQmlEngine>::~shared_ptr()
    (this=0x841f70, __in_chrg=<optimized out>)
    at /usr/include/c++/13/bits/shared_ptr.h:175
 @22 0x00007ffff7f8297a in BaseData::~BaseData()
    (this=0x841f50, __in_chrg=<optimized out>)
    at /home/qydw/kde/src/systemsettings/core/BaseData.cpp:38
 @23 0x00007ffff7f829a2 in BaseData::~BaseData()
    (this=0x841f50, __in_chrg=<optimized out>)
    at /home/qydw/kde/src/systemsettings/core/BaseData.cpp:38
 @24 0x00007ffff7f82fbf in DataHelper::~DataHelper()
    (this=0x7ffff7fbe210 <QGlobalStatic<QtGlobalStatic::Holder<(anonymous namespace)::Q_QGS_internalInstance> >::instance()::holder>, __in_chrg=<optimized out>) at /home/qydw/kde/src/systemsettings/core/BaseData.cpp:24
 @25 0x00007ffff7f82daa in QtGlobalStatic::Holder<(anonymous namespace)::Q_QGS_internalInstance>::~Holder()
    (this=0x7ffff7fbe210 <QGlobalStatic<QtGlobalStatic::Holder<(anonymous namespace)::Q_QGS_internalInstance> >::instance()::holder>, __in_chrg=<optimized out>) at /home/qydw/kde/usr/include/QtCore/qglobalstatic.h:45
 @26 0x00007ffff34439e6 in __run_exit_handlers () at /lib64/libc.so.6
 @27 0x00007ffff3443b30 in  () at /lib64/libc.so.6
 @28 0x00007ffff342a1f7 in __libc_start_call_main () at /lib64/libc.so.6
 @29 0x00007ffff342a2b9 in __libc_start_main_impl () at /lib64/libc.so.6
 @30 0x0000000000413c85 in _start () at ../sysdeps/x86_64/start.S:115

Merge request reports