Possible reload-related PyQt6 crash in dynamic metaobject construction

Matthias Schabel matthias at schabels.com
Sat Sep 19 01:35:17 BST 2026


  Hi,

  I’m seeing a segmentation fault while activating a window in a long-running Spyder session using a napari-based application. The native stack
  reaches PyQt’s dynamic metaobject builder:

  QEventLoop::exec
    → QGuiApplicationPrivate::processFocusWindowEvent
    → QApplicationPrivate::setActiveWindow
    → QWidget::isActiveWindow
    → QMetaObject::cast
    → qpycore_get_qmetaobject
    → qpycore_get_dynamic_metaobject
    → trawl_hierarchy
    → PyObject_GetAttr
    → PyObject_GenericGetAttr

  The fault is EXC_BAD_ACCESS at 0x10, on the main thread during normal window activation.

  This may relate to the August 2024 discussion about a crash after module reload and __class__ replacement
  (https://www.riverbankcomputing.com/pipermail/pyqt/2024-August/045990.html), where SIP’s reload handling was acknowledged as a bug.

  A synthetic subprocess probe produces these results:

  - Construct a Python QObject subclass and invoke its native metaObject() without the GIL: survives.
  - First apply IPython’s update_class(old, new), which replaces the live instance’s __class__: segfaults.
  - After that replacement, call obj.metaObject() from Python before the native call: survives.

  The hypothesis is that class replacement bypasses initialization of the replacement type’s Qt metadata, allowing a later native call to enter the
  Python-dependent builder without the GIL.

  The probe uses ctypes to invoke the native virtual. I don’t yet have a minimal reproducer using ordinary Qt event dispatch, and haven’t established
  that autoreload caused the original crash. Spyder’s configuration enables both IPython autoreload and its separate UMR feature.

  The probe reproduces with Python 3.12.12, PyQt6 6.11.0, Qt 6.11.2, and IPython 9.16.1 and 9.17.1 on macOS 26.5.1, Apple Silicon.

  Thanks,
  Matthias


More information about the PyQt mailing list