I used the shortcut for "Find Uses" on QLatin1String by mistake, in the kio.git project. KDevelop froze with 100% CPU usage for a very long time. Yes there are lots of hits, so I understanad it needs to compute for a long time, but that should keep the GUI responsive (-> chunk the work or use a thread). As a user I should be able to cancel once I realize my mistake. Reproducible: Always Actual Results: #0 0x00007f4812bb49ec in QVector<QPostEvent>::at (this=0x88d5a0, i=80942) at ../../include/QtCore/../../src/corelib/tools/qvector.h:418 #1 0x00007f4812de93ae in QCoreApplication::removePostedEvents (receiver=0xd9b9b40, eventType=0) at kernel/qcoreapplication.cpp:1697 #2 0x00007f4813bf36d2 in QWidget::~QWidget (this=0xd9b9b40, __in_chrg=<optimized out>) at kernel/qwidget.cpp:1666 #3 0x00007f4813d62b9e in QFrame::~QFrame (this=0xd9b9b40, __in_chrg=<optimized out>) at widgets/qframe.cpp:256 #4 0x00007f4813d671e8 in QLabel::~QLabel (this=0xd9b9b40, __in_chrg=<optimized out>) at widgets/qlabel.cpp:243 #5 0x00007f4813d6721e in QLabel::~QLabel (this=0xd9b9b40, __in_chrg=<optimized out>) at widgets/qlabel.cpp:247 #6 0x00007f4812e23058 in QObjectPrivate::deleteChildren (this=0xd9b5ba0) at kernel/qobject.cpp:1963 #7 0x00007f4813bf36be in QWidget::~QWidget (this=0xd9aadc0, __in_chrg=<optimized out>) at kernel/qwidget.cpp:1664 #8 0x00007f4813d62b9e in QFrame::~QFrame (this=0xd9aadc0, __in_chrg=<optimized out>) at widgets/qframe.cpp:256 #9 0x00007f4813e0881d in QAbstractScrollArea::~QAbstractScrollArea (this=0xd9aadc0, __in_chrg=<optimized out>) at widgets/qabstractscrollarea.cpp:575 #10 0x00007f4813e0f2c4 in QScrollArea::~QScrollArea (this=0xd9aadc0, __in_chrg=<optimized out>) at widgets/qscrollarea.cpp:166 #11 0x00007f48100a588f in KDevelop::NavigatableWidgetList::~NavigatableWidgetList (this=0xd9aadc0) at /d/kde/src/5/extragear/kdevelop/kdevplatform/language/duchain/navigation/useswidget.cpp:195 #12 0x00007f48101495a5 in KDevelop::ContextUsesWidget::~ContextUsesWidget (this=0xd9aadc0) at /d/kde/src/5/extragear/kdevelop/kdevplatform/language/duchain/navigation/useswidget.h:89 #13 0x00007f48101495c9 in KDevelop::ContextUsesWidget::~ContextUsesWidget (this=0xd9aadc0) at /d/kde/src/5/extragear/kdevelop/kdevplatform/language/duchain/navigation/useswidget.h:89 #14 0x00007f48100a7e51 in buildContextUses (code=..., declarations=QList<KDevelop::IndexedDeclaration> = {...}, context=0xd7c8c70) at /d/kde/src/5/extragear/kdevelop/kdevplatform/language/duchain/navigation/useswidget.cpp:455 #15 0x00007f48100a7f37 in buildContextUses (code=..., declarations=QList<KDevelop::IndexedDeclaration> = {...}, context=0xd7c8bd0) at /d/kde/src/5/extragear/kdevelop/kdevplatform/language/duchain/navigation/useswidget.cpp:459 #16 0x00007f48100a7f37 in buildContextUses (code=..., declarations=QList<KDevelop::IndexedDeclaration> = {...}, context=0xd8eea40) at /d/kde/src/5/extragear/kdevelop/kdevplatform/language/duchain/navigation/useswidget.cpp:459 #17 0x00007f48100a83f4 in KDevelop::TopContextUsesWidget::setExpanded (this=0xce47990, expanded=true) at /d/kde/src/5/extragear/kdevelop/kdevplatform/language/duchain/navigation/useswidget.cpp:487 #18 0x00007f48100a95d8 in KDevelop::UsesWidget::UsesWidgetCollector::processUses (this=0x2dadc50, topContext=...) at /d/kde/src/5/extragear/kdevelop/kdevplatform/language/duchain/navigation/useswidget.cpp:644 #19 0x00007f48100b275a in KDevelop::UsesCollector::updateReady (this=0x2dadc50, url=..., topContext=...) at /d/kde/src/5/extragear/kdevelop/kdevplatform/language/duchain/navigation/usescollector.cpp:402 #20 0x00007f4810146197 in KDevelop::UsesCollector::qt_static_metacall (_o=0x2dadc50, _c=QMetaObject::InvokeMetaMethod, _id=3, _a=0x7ffe33801020) at /d/kde/build/5/extragear/kdevelop/kdevplatform/language/moc_usescollector.cpp:94 #21 0x00007f4812df46af in QMetaMethod::invoke (this=0x7ffe338014e0, object=0x2dadc50, connectionType=Qt::DirectConnection, returnValue=..., val0=..., val1=..., val2=..., val3=..., val4=..., val5=..., val6=..., val7=..., val8=..., val9=...) at kernel/qmetaobject.cpp:2211 #22 0x00007f4812df3b9a in QMetaObject::invokeMethod (obj=0x2dadc50, member=0x7f481014dd52 "updateReady", type=Qt::DirectConnection, ret=..., val0=..., val1=..., val2=..., val3=..., val4=..., val5=..., val6=..., val7=..., val8=..., val9=...) at kernel/qmetaobject.cpp:1478 #23 0x00007f480ff0eeef in QMetaObject::invokeMethod (obj=0x2dadc50, member=0x7f481014dd52 "updateReady", type=Qt::DirectConnection, val0=..., val1=..., val2=..., val3=..., val4=..., val5=..., val6=..., val7=..., val8=..., val9=...) at /d/qt/5/kde/qtbase/include/QtCore/../../src/corelib/kernel/qobjectdefs.h:412 #24 0x00007f480ff5f261 in KDevelop::DUChain::updateContextForUrl (this=0x1e9cc40, document=..., minFeatures=KDevelop::TopDUContext::Features::AllDeclarationsContextsAndUses, notifyReady=0x2dadc50, priority=1) at /d/kde/src/5/extragear/kdevelop/kdevplatform/language/duchain/duchain.cpp:1678 #25 0x00007f48100b1102 in KDevelop::UsesCollector::startCollecting (this=0x2dadc50) at /d/kde/src/5/extragear/kdevelop/kdevplatform/language/duchain/navigation/usescollector.cpp:296 #26 0x00007f48100a8a83 in KDevelop::UsesWidget::UsesWidget (this=0x6f6dd00, declaration=..., customCollector=...) at /d/kde/src/5/extragear/kdevelop/kdevplatform/language/duchain/navigation/useswidget.cpp:535 #27 0x00007f4810094694 in KDevelop::UsesNavigationContext::UsesNavigationContext (this=0xcbf910, declaration=..., previousContext=0x433d640) at /d/kde/src/5/extragear/kdevelop/kdevplatform/language/duchain/navigation/usesnavigationcontext.cpp:30 #28 0x00007f481008e289 in KDevelop::AbstractNavigationContext::execute (this=0x433d640, action=...) at /d/kde/src/5/extragear/kdevelop/kdevplatform/language/duchain/navigation/abstractnavigationcontext.cpp:183 #29 0x00007f47cdfa0ec8 in ContextBrowserPlugin::showUsesDelayed (this=0x23e4c30, declaration=...) at /d/kde/src/5/extragear/kdevelop/kdevplatform/plugins/contextbrowser/contextbrowser.cpp:375 The constructor of a UsesWidget triggers the destructor of another UsesWidget?? 447│ QList<ContextUsesWidget*> buildContextUses(const CodeRepresentation& code, QList<IndexedDeclaration> declarations, DUContext* context) { 448│ QList<ContextUsesWidget*> ret; 449│ 450│ if(!context->parentContext() || isNewGroup(context->parentContext(), context)) { 451│ ContextUsesWidget* created = new ContextUsesWidget(code, declarations, context); 452│ if(created->hasItems()) 453│ ret << created; 454│ else 455├> delete created; 456│ } Creating widgets and deleting them right away sounds very slow, when done in a loop (the caller has a loop).
For the one planning to work on this: We should probably just drop the hugely inefficient implementation of the Uses Widget feature (one QWidget per use, for instance... sic!) and instead base it on a proper Qt model.