[Interest] Crash when signal fires

Ben Haller bhaller at mac.com
Wed Apr 22 01:46:21 CEST 2020


[ I realized I ought to supply the crash backtrace; I have appended it below my signature. ]

Hi folks.  I’m seeing something weird that I don’t understand.  I have a connection defined for the main window of my Qt Widgets app, like so:

   connect(qApp, &QApplication::focusChanged, [this]() { updateUIEnabling(); });

I’m seeing a 100% reproducible crash as a result of this.  When the focusChanged signal fires, I end up in updateUIEnabling() as expected, but I immediately crash because something about the state of things is corrupted; the immediate symptom, according to the debugger, is that the ui pointer for my main window is equal to 0x1 (yuck).  I try to access a button,  ui->playOneStepButton, and it crashes.  As I said, 100% reproducible.

The weird thing is that this does *not* happen if I change the connect statement to this:

   connect(qApp, &QApplication::focusChanged, this, &QtSLiMWindow::updateUIEnabling);

Now, 100% of the time, there is no problem, no crash, and my app chugs along happily.  No other code changes involved.  I can literally flip this connect definition back and forth in my code and go from 100% crashing to 100% fine.

I’m pretty new to Qt and maybe I’m just being clueless somehow; but I thought that the two definitions above would be essentially identical in their effect.  Why does the first one crash?  Note that it works fine in general; it seems to crash specifically when I open a *second* main window (which makes its own connection to focusChanged in the same way), and then close that second main window.  Now the first main window’s connection is somehow unhappy, and the next time I trigger the focusChanged() signal, boom.  It’s as if the connection for the second window somehow interferes with the connection for the first window, and closing the second window leads to a corruption in the connection state.

Naturally, I am now nervous about using the first type of connection anywhere in my code, since I don’t understand what the issue is.  Can anyone shed light on this?

Cheers,
-B.

Benjamin C. Haller
Messer Lab
Cornell University


Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   com.sticksoftware.QtSLiM      	0x00000001003c84b1 QtSLiMWindow::updateUIEnabling() + 17 (QtSLiMWindow.cpp:1589)
1   com.sticksoftware.QtSLiM      	0x00000001003d224e QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, QtSLiMWindow::init()::$_3>::call(QtSLiMWindow::init()::$_3&, void**) + 14 (qobjectdefs_impl.h:146)
2   org.qt-project.QtCore         	0x000000010228ca95 void doActivate<false>(QObject*, int, void**) + 1157 (memory:2597)
3   org.qt-project.QtWidgets      	0x00000001013d67de QApplicationPrivate::setFocusWidget(QWidget*, Qt::FocusReason) + 510
4   org.qt-project.QtWidgets      	0x000000010140f6fd QWidget::setFocus(Qt::FocusReason) + 637 (qwidget.cpp:6356)
5   org.qt-project.QtWidgets      	0x00000001013d7dd8 QApplication::setActiveWindow(QWidget*) + 1160
6   org.qt-project.QtWidgets      	0x00000001013d8333 QApplicationPrivate::notifyActiveWindowChange(QWindow*) + 51 (qapplication.cpp:2101)
7   org.qt-project.QtGui          	0x0000000101a35623 QGuiApplicationPrivate::processActivatedEvent(QWindowSystemInterfacePrivate::ActivatedWindowEvent*) + 675 (qguiapplication.cpp:2438)
8   org.qt-project.QtGui          	0x0000000101a12cc3 bool QWindowSystemInterfacePrivate::handleWindowSystemEvent<QWindowSystemInterface::SynchronousDelivery>(QWindowSystemInterfacePrivate::WindowSystemEvent*) + 115 (qwindowsysteminterface.cpp:106)
9   libqcocoa.dylib               	0x00000001063511ee QCocoaWindow::windowDidBecomeKey() + 238 (qcocoawindow.mm:1194)
10  org.qt-project.QtCore         	0x00000001022648d6 QMetaMethod::invoke(QObject*, Qt::ConnectionType, QGenericReturnArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument) const + 1270
11  libqcocoa.dylib               	0x0000000106354830 invocation function for block in qRegisterNotificationCallbacks() + 1936 (qcocoawindow.mm:131)
12  com.apple.Foundation          	0x00007fff3860cfab -[__NSObserver _doit:] + 296
13  com.apple.CoreFoundation      	0x00007fff35f8c35f __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 12
14  com.apple.CoreFoundation      	0x00007fff35f8c2f3 ___CFXRegistrationPost1_block_invoke + 63
15  com.apple.CoreFoundation      	0x00007fff35f8c268 _CFXRegistrationPost1 + 372
16  com.apple.CoreFoundation      	0x00007fff35f8bebe ___CFXNotificationPost_block_invoke + 97
17  com.apple.CoreFoundation      	0x00007fff35f5b7e2 -[_CFXNotificationRegistrar find:object:observer:enumerator:] + 1575
18  com.apple.CoreFoundation      	0x00007fff35f5ac82 _CFXNotificationPost + 1351
19  com.apple.Foundation          	0x00007fff385e0a22 -[NSNotificationCenter postNotificationName:object:userInfo:] + 59
20  com.apple.AppKit              	0x00007fff3333675e -[NSWindow becomeKeyWindow] + 1276
21  com.apple.AppKit              	0x00007fff332b85ae -[NSWindow _changeKeyAndMainLimitedOK:] + 963
22  com.apple.AppKit              	0x00007fff332b80b2 -[NSWindow _makeKeyRegardlessOfVisibility] + 76
23  com.apple.AppKit              	0x00007fff332ab8d9 -[NSWindow makeKeyAndOrderFront:] + 40
24  libqcocoa.dylib               	0x000000010634d83d QCocoaWindow::setVisible(bool) + 1597 (qcocoawindow.mm:370)
25  org.qt-project.QtGui          	0x0000000101a3d138 QWindowPrivate::setVisible(bool) + 1112 (qwindow.cpp:410)
26  org.qt-project.QtWidgets      	0x00000001014115f7 QWidgetPrivate::show_sys() + 903 (qwidget.cpp:7910)
27  org.qt-project.QtWidgets      	0x00000001014129e5 QWidgetPrivate::show_helper() + 405 (qwidget.cpp:7833)
28  org.qt-project.QtWidgets      	0x0000000101413626 QWidgetPrivate::setVisible(bool) + 806 (qwidget.cpp:8129)
29  com.sticksoftware.QtSLiM      	0x0000000100426d55 QtSLiMEidosConsole::setVariableBrowserVisibility(bool) + 149 (QtSLiMEidosConsole.cpp:221)
30  com.sticksoftware.QtSLiM      	0x00000001003d1170 QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, void (QtSLiMAppDelegate::*)()>::call(void (QtSLiMAppDelegate::*)(), QtSLiMAppDelegate*, void**) + 32 (qobjectdefs_impl.h:152)
31  org.qt-project.QtCore         	0x000000010228ca95 void doActivate<false>(QObject*, int, void**) + 1157 (memory:2597)
32  org.qt-project.QtWidgets      	0x00000001014c271f QAbstractButtonPrivate::emitClicked() + 111 (qsharedpointer_impl.h:701)
33  org.qt-project.QtWidgets      	0x00000001014c25b9 QAbstractButtonPrivate::click() + 233 (qabstractbutton.cpp:409)
34  org.qt-project.QtWidgets      	0x00000001014c36ef QAbstractButton::mouseReleaseEvent(QMouseEvent*) + 271 (qabstractbutton.cpp:1013)
35  org.qt-project.QtWidgets      	0x000000010141399d QWidget::event(QEvent*) + 445 (qwidget.cpp:8659)
36  org.qt-project.QtWidgets      	0x00000001013d8f5a QApplicationPrivate::notify_helper(QObject*, QEvent*) + 266 (qapplication.cpp:3687)
37  org.qt-project.QtWidgets      	0x00000001013dbe32 QApplication::notify(QObject*, QEvent*) + 7330 (qapplication.cpp:3129)
38  org.qt-project.QtCore         	0x00000001022599f4 QCoreApplication::notifyInternal2(QObject*, QEvent*) + 212 (qcoreapplication.cpp:1075)
39  org.qt-project.QtWidgets      	0x00000001013d9880 QApplicationPrivate::sendMouseEvent(QWidget*, QMouseEvent*, QWidget*, QWidget*, QWidget**, QPointer<QWidget>&, bool, bool) + 896
40  org.qt-project.QtWidgets      	0x0000000101432908 QWidgetWindow::handleMouseEvent(QMouseEvent*) + 1704 (qwidgetwindow.cpp:673)
41  org.qt-project.QtWidgets      	0x00000001014315f5 QWidgetWindow::event(QEvent*) + 229 (qwidgetwindow.cpp:295)
42  org.qt-project.QtWidgets      	0x00000001013d8f5a QApplicationPrivate::notify_helper(QObject*, QEvent*) + 266 (qapplication.cpp:3687)
43  org.qt-project.QtWidgets      	0x00000001013da3e6 QApplication::notify(QObject*, QEvent*) + 598
44  org.qt-project.QtCore         	0x00000001022599f4 QCoreApplication::notifyInternal2(QObject*, QEvent*) + 212 (qcoreapplication.cpp:1075)
45  org.qt-project.QtGui          	0x0000000101a32895 QGuiApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::MouseEvent*) + 3397 (qguiapplication.cpp:2204)
46  org.qt-project.QtGui          	0x0000000101a1815b QWindowSystemInterface::sendWindowSystemEvents(QFlags<QEventLoop::ProcessEventsFlag>) + 219 (qwindowsysteminterface.cpp:1176)
47  libqcocoa.dylib               	0x00000001063690f0 QCocoaEventDispatcherPrivate::processPostedEvents() + 320 (qcocoaeventdispatcher.mm:890)
48  libqcocoa.dylib               	0x0000000106369858 QCocoaEventDispatcherPrivate::postedEventsSourceCallback(void*) + 40
49  com.apple.CoreFoundation      	0x00007fff35f96b21 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
50  com.apple.CoreFoundation      	0x00007fff35f96ac0 __CFRunLoopDoSource0 + 103
51  com.apple.CoreFoundation      	0x00007fff35f968d4 __CFRunLoopDoSources0 + 209
52  com.apple.CoreFoundation      	0x00007fff35f95740 __CFRunLoopRun + 1272
53  com.apple.CoreFoundation      	0x00007fff35f94bd3 CFRunLoopRunSpecific + 499
54  com.apple.HIToolbox           	0x00007fff34aea65d RunCurrentEventLoopInMode + 292
55  com.apple.HIToolbox           	0x00007fff34aea2a9 ReceiveNextEventCommon + 356
56  com.apple.HIToolbox           	0x00007fff34aea127 _BlockUntilNextEventMatchingListInModeWithFilter + 64
57  com.apple.AppKit              	0x00007fff3315aba4 _DPSNextEvent + 990
58  com.apple.AppKit              	0x00007fff33159380 -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 1352
59  com.apple.AppKit              	0x00007fff3314b09e -[NSApplication run] + 658
60  libqcocoa.dylib               	0x00000001063685d3 QCocoaEventDispatcher::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) + 2579 (qcocoaeventdispatcher.mm:430)
61  org.qt-project.QtCore         	0x0000000102255a7f QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) + 431 (atomic:929)
62  org.qt-project.QtCore         	0x000000010225a002 QCoreApplication::exec() + 130 (qcoreapplication.cpp:1383)
63  com.sticksoftware.QtSLiM      	0x00000001003ba56e main + 670
64  libdyld.dylib                 	0x00007fff6d4a17fd start + 1




More information about the Interest mailing list