Bug 472793

Summary: merkuro-calendar crashes on startup
Product: [Applications] Merkuro Reporter: Eastern Li <EasternLi>
Component: generalAssignee: Claudio Cambra <claudio.cambra>
Status: CONFIRMED ---    
Severity: crash CC: bugs.kde.org, burster, carl, dehe_tian, f.baumg, funny0facer, jsardid, kde, o.freyermuth, oldherl, peterbun206, peterriesde, sebastian, tahall256, vistausss
Priority: NOR    
Version: 23.08.5   
Target Milestone: ---   
Platform: Arch Linux   
OS: Linux   
Latest Commit: Version Fixed In:
Sentry Crash Report:

Description Eastern Li 2023-07-30 09:27:10 UTC
SUMMARY
merkuro-calendar crashes because of binding loop when user requests Chinese UI

> file:///usr/lib/qt/qml/org/kde/kirigami.2/private/globaltoolbar/ToolBarPageHeader.qml:32:9: QML Loader (parent or ancestor of QQuickLayoutAttached): Binding loop detected for property "maximumWidth"

STEPS TO REPRODUCE
1. add a new linux user and login
2. run `merkuro-calendar` => work
3. run `LANG=zh_CN LANGUAGE= merkuro-calendar` => crash

SOFTWARE/OS VERSIONS
merkuro-calenda (Gear) 23.07.80
KDE Plasma Version: 5.27.6 (wayland)
KDE Frameworks Version: 5.108.0
Qt Version: 5.15.10 (kde patched)
Comment 1 brainpower 2023-07-31 12:00:49 UTC
Any "LANG" which is not empty or C, does produce a crash:

no crash:
LANG= merkuro-calendar
LANG=C merkuro-calendar

crash:
LANG=C.UTF-8 merkuro-calendar
LANG=de_DE.UTF-8 merkuro-calendar
LANG=fr_FR.UTF-8 merkuro-calendar
LANG=en_US.UTF-8 merkuro-calendar
LANG=en_US merkuro-calendar

The bind loop message seems irrelevant, since it also appears when it does not crash.

From the backtrace it seems to try to look up a qml property and fails doing that.
I've got no idea how to debug this further, though:
(gdb) bt
#0  0x00007ffff709f452 in QV4::QQmlValueTypeWrapper::create(QV4::ExecutionEngine*, QObject*, int, QMetaObject const*, int)
    (engine=0x555555cd8870, object=0x5555567c3e80, property=13, metaObject=0x7ffff7d11de0 <QQuickColorValueType::staticMetaObject>, typeId=67)
    at /usr/src/debug/qt5-declarative/qtdeclarative/src/qml/qml/qqmlvaluetypewrapper.cpp:187
#1  0x00007ffff6f74476 in loadProperty(QV4::ExecutionEngine*, QObject*, QQmlPropertyData const&) (v4=0x555555cd8870, object=0x5555567c3e80, property=...)
    at /usr/src/debug/qt5-declarative/qtdeclarative/src/qml/jsruntime/qv4qobjectwrapper.cpp:186
#2  0x00007ffff6f7535d in QV4::QObjectWrapper::getQmlProperty(QV4::ExecutionEngine*, QQmlContextData*, QObject*, QV4::String*, QV4::QObjectWrapper::RevisionMode, bool*, QQmlPropertyData**)
    (property=0x0, hasProperty=0x0, revisionMode=QV4::QObjectWrapper::IgnoreRevision, name=0x7fffbc3c05b0, object=0x5555567c3e80, qmlContext=0x555558478de0, engine=0x555555cd8870)
    at /usr/src/debug/qt5-declarative/qtdeclarative/src/qml/jsruntime/qv4qobjectwrapper.cpp:388
#3  QV4::QObjectWrapper::getQmlProperty(QV4::ExecutionEngine*, QQmlContextData*, QObject*, QV4::String*, QV4::QObjectWrapper::RevisionMode, bool*, QQmlPropertyData**)
    (engine=0x555555cd8870, qmlContext=0x555558478de0, object=0x5555567c3e80, name=0x7fffbc3c05b0, revisionMode=QV4::QObjectWrapper::IgnoreRevision, hasProperty=0x0, property=0x0)
    at /usr/src/debug/qt5-declarative/qtdeclarative/src/qml/jsruntime/qv4qobjectwrapper.cpp:358
#4  0x00007ffff70a50bf in QV4::QQmlTypeWrapper::virtualGet(QV4::Managed const*, QV4::PropertyKey, QV4::Value const*, bool*)
    (m=0x7fffbc3c05a0, id=..., receiver=0x7fffbc3c05a0, hasProperty=0x0) at /usr/src/debug/qt5-declarative/qtdeclarative/src/qml/qml/qqmltypewrapper.cpp:268
#5  0x00007ffff6f1f301 in QV4::Lookup::getterFallback(QV4::Lookup*, QV4::ExecutionEngine*, QV4::Value const&) (l=0x555556516920, engine=0x555555cd8870, object=<optimized out>)
    at /usr/src/debug/qt5-declarative/qtdeclarative/src/qml/jsruntime/qv4lookup.cpp:231
#6  0x00007fffa53b6828 in  ()
#7  0x00007fffff7ff4e0 in  ()
#8  0x0000000000000000 in  ()
Comment 2 Eastern Li 2023-07-31 16:42:31 UTC
(In reply to brainpower from comment #1)
> Any "LANG" which is not empty or C, does produce a crash:
> 
> no crash:
> LANG= merkuro-calendar
> LANG=C merkuro-calendar
> 
> crash:
> LANG=C.UTF-8 merkuro-calendar
> LANG=de_DE.UTF-8 merkuro-calendar
> LANG=fr_FR.UTF-8 merkuro-calendar
> LANG=en_US.UTF-8 merkuro-calendar
> LANG=en_US merkuro-calendar

not any LANG produce a crash
`LANG=en_US.UTF-8 LANGUAGE=en_US merkuro-calendar` => work

extra info:
if rm/mv /usr/share/locale/<LANG>/LC_MESSAGES/libkirigami2plugin_qt.qm or libphonon_qt.qm,
then the window is shown with mainly English UI.
Comment 3 brainpower 2023-08-01 07:26:14 UTC
oh, I overlooked the LANGUAGE var was set (and relevant) on my system and only overwrote LANG.
with LANGUAGE unset or set analogous to LANG the en_* locales work for me too.
And locales with no corresponding *.qm files installed, do not crash, but the app is not fully translated of course.
Comment 4 dehe_tian 2023-08-30 00:18:09 UTC
Seems if you set `LANGUAGE=C` and `LANG=<LANG>.UTF-8`, merkuro-calendar will start and load locale without crash.
For example:
> LANG=zh_CN.UTF-8 LANGUAGE=C merkuro-calendar
will start and load zh_CN locale normally.
Comment 5 Heimen Stoffels 2023-09-11 15:07:08 UTC
I can confirm that @dehe_tian@outlook.com's workaround fixes this issue.
Comment 6 Peter Ries 2023-09-14 14:55:22 UTC
hoped it would be fixed in 23.08.1 - issue still there.
Comment 7 Carl Schwan 2023-09-27 11:01:06 UTC
Can confirm the issue with the qt5 build of Merkuro on my work computer but not on master with qt6 on my personal computer.

The backtrace tells me that this is caused by a infinite lool in the until we get a stack overflow

#3801 0x00007ffff44e8481 in void doActivate<false>(QObject*, int, void**) () at /lib64/libQt5Core.so.5
#3802 0x00007ffff4ef19a4 in QQuickAction::checkedChanged(bool) () at /lib64/libQt5QuickTemplates2.so.5
#3803 0x00007ffff4ef7b1d in QQuickAbstractButton::setChecked(bool) () at /lib64/libQt5QuickTemplates2.so.5
#3804 0x00007ffff44e8481 in void doActivate<false>(QObject*, int, void**) () at /lib64/libQt5Core.so.5
#3805 0x00007ffff4ef19a4 in QQuickAction::checkedChanged(bool) () at /lib64/libQt5QuickTemplates2.so.5

weird that it only happens with some locales
Comment 8 Johannes Brakensiek 2024-01-10 09:38:14 UTC
Confirmed this still happens with version 23.08.04.
Comment 9 Sebastian Philipp 2024-03-27 14:41:53 UTC
see this as well. 

#0  0x00007f540ff55c7a QV4::Heap::InternalClass::changeVTableImpl(QV4::VTable const*) (libQt5Qml.so.5   0x155c7a)
#1  0x00007f541011f37b QV4::QQmlValueTypeWrapper::create(QV4::ExecutionEngine*, QObject*, int, QMetaObject const*, int) (libQt5Qml.so.5   0x31f37b)
#2  0x00007f540ffc4e75 loadProperty(QV4::ExecutionEngine*, QObject*, QQmlPropertyData const&) (libQt5Qml.so.5   0x1c4e75)
#3  0x00007f540ffc59c3 QV4::QObjectWrapper::getQmlProperty(QV4::ExecutionEngine*, QQmlContextData*, QObject*, QV4::String*, QV4::QObjectWrapper::RevisionMode, bool*, QQmlPropertyData**) (libQt5Qml.so.5   0x1c59c3)
#4  0x00007f5410124c77 QV4::QQmlTypeWrapper::virtualGet(QV4::Managed const*, QV4::PropertyKey, QV4::Value const*, bool*) (libQt5Qml.so.5   0x324c77)
#5  0x00007f540ff4f585 QV4::Lookup::getterFallback(QV4::Lookup*, QV4::ExecutionEngine*, QV4::Value const&) (libQt5Qml.so.5   0x14f585)
#6  0x00007f53d4449aa1 n/a (n/a   0x0)
#7  0x00007f540ffead50 QV4::Moth::VME::exec(QV4::CppStackFrame*, QV4::ExecutionEngine*) (libQt5Qml.so.5   0x1ead50)
#8  0x00007f540ff7ad02 QV4::Function::call(QV4::Value const*, QV4::Value const*, int, QV4::ExecutionContext const*) (libQt5Qml.so.5   0x17ad02)
#9  0x00007f5410111040 QQmlJavaScriptExpression::evaluate(QV4::CallData*, bool*) (libQt5Qml.so.5   0x311040)
#10 0x00007f54101177c7 QQmlBinding::evaluate(bool*) (libQt5Qml.so.5   0x3177c7)
#11 0x00007f541011bd7b QQmlNonbindingBinding::doUpdate(QQmlJavaScriptExpression::DeleteWatcher const&, QFlags<QQmlPropertyData::WriteFlag>, QV4::Scope&) (libQt5Qml.so.5   0x31bd7b)
#12 0x00007f5410119615 QQmlBinding::update(QFlags<QQmlPropertyData::WriteFlag>) (libQt5Qml.so.5   0x319615)
#13 0x00007f54100f4e17 QQmlNotifier::emitNotify(QQmlNotifierEndpoint*, void**) (libQt5Qml.so.5   0x2f4e17)
#14 0x00007f540e6e8e20 void doActivate<false>(QObject*, int, void**) (libQt5Core.so.5   0x2e8e20)
#15 0x00007f540e6e9151 void doActivate<false>(QObject*, int, void**) (libQt5Core.so.5   0x2e9151)
#16 0x00007f540f0f19a4 QQuickAction::checkedChanged(bool) (libQt5QuickTemplates2.so.5   0xa49a4)
#17 0x00007f540f0f7b0d QQuickAbstractButton::setChecked(bool) (libQt5QuickTemplates2.so.5   0xaab0d)
#18 0x00007f540f0f7b44 QQuickAbstractButton::setChecked(bool) (libQt5QuickTemplates2.so.5   0xaab44)
#19 0x00007f540e6e9151 void doActivate<false>(QObject*, int, void**) (libQt5Core.so.5   0x2e9151)
#20 0x00007f540f0f19a4 QQuickAction::checkedChanged(bool) (libQt5QuickTemplates2.so.5   0xa49a4)
#21 0x00007f540f0f7b0d QQuickAbstractButton::setChecked(bool) (libQt5QuickTemplates2.so.5   0xaab0d)
#22 0x00007f540e6e9151 void doActivate<false>(QObject*, int, void**) (libQt5Core.so.5   0x2e9151)
#23 0x00007f540f0f19a4 QQuickAction::checkedChanged(bool) (libQt5QuickTemplates2.so.5   0xa49a4)
#24 0x00007f540f0f7b0d QQuickAbstractButton::setChecked(bool) (libQt5QuickTemplates2.so.5   0xaab0d)
#25 0x00007f540e6e9151 void doActivate<false>(QObject*, int, void**) (libQt5Core.so.5   0x2e9151)
#26 0x00007f540f0f19a4 QQuickAction::checkedChanged(bool) (libQt5QuickTemplates2.so.5   0xa49a4)
#27 0x00007f540f0f7b0d QQuickAbstractButton::setChecked(bool) (libQt5QuickTemplates2.so.5   0xaab0d)
#28 0x00007f540e6e9151 void doActivate<false>(QObject*, int, void**) (libQt5Core.so.5   0x2e9151)
#29 0x00007f540f0f19a4 QQuickAction::checkedChanged(bool) (libQt5QuickTemplates2.so.5   0xa49a4)
#30 0x00007f540f0f7b0d QQuickAbstractButton::setChecked(bool) (libQt5QuickTemplates2.so.5   0xaab0d)
#31 0x00007f540e6e9151 void doActivate<false>(QObject*, int, void**) (libQt5Core.so.5   0x2e9151)
#32 0x00007f540f0f19a4 QQuickAction::checkedChanged(bool) (libQt5QuickTemplates2.so.5   0xa49a4)
#33 0x00007f540f0f7b0d QQuickAbstractButton::setChecked(bool) (libQt5QuickTemplates2.so.5   0xaab0d)
#34 0x00007f540e6e9151 void doActivate<false>(QObject*, int, void**) (libQt5Core.so.5   0x2e9151)
#35 0x00007f540f0f19a4 QQuickAction::checkedChanged(bool) (libQt5QuickTemplates2.so.5   0xa49a4)
#36 0x00007f540f0f7b0d QQuickAbstractButton::setChecked(bool) (libQt5QuickTemplates2.so.5   0xaab0d)
#37 0x00007f540e6e9151 void doActivate<false>(QObject*, int, void**) (libQt5Core.so.5   0x2e9151)
#38 0x00007f540f0f19a4 QQuickAction::checkedChanged(bool) (libQt5QuickTemplates2.so.5   0xa49a4)
#39 0x00007f540f0f7b0d QQuickAbstractButton::setChecked(bool) (libQt5QuickTemplates2.so.5   0xaab0d)
#40 0x00007f540e6e9151 void doActivate<false>(QObject*, int, void**) (libQt5Core.so.5   0x2e9151)
#41 0x00007f540f0f19a4 QQuickAction::checkedChanged(bool) (libQt5QuickTemplates2.so.5   0xa49a4)
#42 0x00007f540f0f7b0d QQuickAbstractButton::setChecked(bool) (libQt5QuickTemplates2.so.5   0xaab0d)
#43 0x00007f540e6e9151 void doActivate<false>(QObject*, int, void**) (libQt5Core.so.5   0x2e9151)
#44 0x00007f540f0f19a4 QQuickAction::checkedChanged(bool) (libQt5QuickTemplates2.so.5   0xa49a4)
#45 0x00007f540f0f7b0d QQuickAbstractButton::setChecked(bool) (libQt5QuickTemplates2.so.5   0xaab0d)
#46 0x00007f540e6e9151 void doActivate<false>(QObject*, int, void**) (libQt5Core.so.5   0x2e9151)
#47 0x00007f540f0f19a4 QQuickAction::checkedChanged(bool) (libQt5QuickTemplates2.so.5   0xa49a4)
#48 0x00007f540f0f7b0d QQuickAbstractButton::setChecked(bool) (libQt5QuickTemplates2.so.5   0xaab0d)
#49 0x00007f540e6e9151 void doActivate<false>(QObject*, int, void**) (libQt5Core.so.5   0x2e9151)
#50 0x00007f540f0f19a4 QQuickAction::checkedChanged(bool) (libQt5QuickTemplates2.so.5   0xa49a4)
#51 0x00007f540f0f7b0d QQuickAbstractButton::setChecked(bool) (libQt5QuickTemplates2.so.5   0xaab0d)
#52 0x00007f540e6e9151 void doActivate<false>(QObject*, int, void**) (libQt5Core.so.5   0x2e9151)
#53 0x00007f540f0f19a4 QQuickAction::checkedChanged(bool) (libQt5QuickTemplates2.so.5   0xa49a4)
#54 0x00007f540f0f7b0d QQuickAbstractButton::setChecked(bool) (libQt5QuickTemplates2.so.5   0xaab0d)
#55 0x00007f540e6e9151 void doActivate<false>(QObject*, int, void**) (libQt5Core.so.5   0x2e9151)
#56 0x00007f540f0f19a4 QQuickAction::checkedChanged(bool) (libQt5QuickTemplates2.so.5   0xa49a4)
#57 0x00007f540f0f7b0d QQuickAbstractButton::setChecked(bool) (libQt5QuickTemplates2.so.5   0xaab0d)
#58 0x00007f540e6e9151 void doActivate<false>(QObject*, int, void**) (libQt5Core.so.5   0x2e9151)
#59 0x00007f540f0f19a4 QQuickAction::checkedChanged(bool) (libQt5QuickTemplates2.so.5   0xa49a4)
#60 0x00007f540f0f7b0d QQuickAbstractButton::setChecked(bool) (libQt5QuickTemplates2.so.5   0xaab0d)
#61 0x00007f540e6e9151 void doActivate<false>(QObject*, int, void**) (libQt5Core.so.5   0x2e9151)
#62 0x00007f540f0f19a4 QQuickAction::checkedChanged(bool) (libQt5QuickTemplates2.so.5   0xa49a4)
#63 0x00007f540f0f7b0d QQuickAbstractButton::setChecked(bool) (libQt5QuickTemplates2.so.5   0xaab0d)

---

temp = <error reading variable temp (Cannot access memory at address 0x7fff426bdff0)>
t = <optimized out>
newClass = <optimized out>
(gdb) info args
this = 0x7f53e0000880
vt = 0x7f541029ace0 <QV4::QQmlValueTypeReference::static_vtbl>
(gdb) where
#0  QV4::Heap::InternalClass::changeVTableImpl (this=0x7f53e0000880, 
    vt=vt@entry=0x7f541029ace0 <QV4::QQmlValueTypeReference::static_vtbl>)
    at jsruntime/qv4internalclass.cpp:529
#1  0x00007f541011f37b in QV4::Heap::InternalClass::changeVTable (
    vt=0x7f541029ace0 <QV4::QQmlValueTypeReference::static_vtbl>, this=<optimized out>)
    at ../../include/QtQml/5.15.12/QtQml/private/../../../../../src/qml/jsruntime/qv4internalclass_p.h:456
#2  QV4::InternalClass::changeVTable (vt=0x7f541029ace0 <QV4::QQmlValueTypeReference::static_vtbl>, 
    this=0x7f53d45bf5c8)
    at ../../include/QtQml/5.15.12/QtQml/private/../../../../../src/qml/jsruntime/qv4managed_p.h:226
#3  QV4::MemoryManager::allocateObject<QV4::QQmlValueTypeReference> (this=0x55588007cf00)
    at ../../include/QtQml/5.15.12/QtQml/private/../../../../../src/qml/memory/qv4mm_p.h:209
#4  QV4::MemoryManager::allocate<QV4::QQmlValueTypeReference> (this=0x55588007cf00)
    at ../../include/QtQml/5.15.12/QtQml/private/../../../../../src/qml/memory/qv4mm_p.h:244
#5  QV4::QQmlValueTypeWrapper::create (engine=engine@entry=0x55588049ac20, 
    object=object@entry=0x5558818efbd0, property=13, 
    metaObject=metaObject@entry=0x7f5410f7e5a0 <QQuickColorValueType::staticMetaObject>, typeId=67)
    at qml/qqmlvaluetypewrapper.cpp:191
#6  0x00007f540ffc4e75 in loadProperty (v4=0x55588049ac20, object=0x5558818efbd0, property=...)
    at jsruntime/qv4qobjectwrapper.cpp:186
#7  0x00007f540ffc59c3 in QV4::QObjectWrapper::getQmlProperty (engine=engine@entry=0x55588049ac20, 
    qmlContext=qmlContext@entry=0x5558818efd10, object=0x5558818efbd0, name=0x7f53d45bf5b8, 
    revisionMode=revisionMode@entry=QV4::QObjectWrapper::IgnoreRevision, 
    hasProperty=hasProperty@entry=0x0, property=0x0) at jsruntime/qv4qobjectwrapper.cpp:388
#8  0x00007f5410124c77 in QV4::QQmlTypeWrapper::virtualGet (m=0x7f53d45bf5a8, id=..., 
    receiver=0x7f53d45bf5a8, hasProperty=0x0) at qml/qqmltypewrapper.cpp:268
#9  0x00007f540ff4f585 in QV4::Object::get (receiver=0x7f53d45bf5a8, hasProperty=0x0, 
    name=0x7f53d45bf5b0, this=0x7f53d45bf5a8)
    at ../../include/QtQml/5.15.12/QtQml/private/../../../../../src/qml/jsruntime/qv4string_p.h:167
#10 QV4::Lookup::getterFallback (l=<optimized out>, engine=0x55588049ac20, object=...)
    at jsruntime/qv4lookup.cpp:231
#11 0x00007f53d4449aa1 in ?? ()




Workaround: LANG=C.UTF-8 LANGUAGE=C merkuro-calendar
Comment 10 Erik Quaeghebeur 2024-07-12 12:56:37 UTC
Confirmed this still happens with version 23.08.5.