退出阶段析构顶层 QWidget → QThreadStorage 已拆除 → 空指针崩溃

栈与机制


0 QtCore  QThreadStorageData::get()        qthreadstorage.cpp:122   ← currentThreadData 为 null
1 QtGui   QOpenGLContext::currentContext() qopenglcontext.cpp:246
2 QtGui   QSurface::~QSurface()
3 QtGui   QWindow::~QWindow()
4 QtWidgets QWidgetWindow::~QWidgetWindow()
5 QtWidgets QWidgetPrivate::deleteTLSysExtra()
6 QtWidgets QWidget::destroy()
7 QtWidgets QWidget::~QWidget()
8-10 (app 帧,无符号)
11-12 libsystem_c (exit/__cxa_finalize 处理链)
13-15 AppKit (app 终止路径)

进程退出(exit() / NSApp 终止)后的 atexit/静态析构阶段,某顶层 QWidget 才被

析构。此时 Qt 的 per-thread 数据(QThreadData/TLS)已随 QApplication 拆除,

QOpenGLContext::currentContext() 内部 QThreadStorage::localData() 解引用

空 TLS → 崩溃。

定位建议(下一步)

(常见模式:static XxxWnd* s_inst = new XxxWnd; 无 parent、不随主窗口销毁),

以及 atexit / 静态对象持有 widget 的成员。

影响评估

崩溃发生在用户主动退出 app 的收尾阶段,用户对崩溃本身通常无感知(窗口已关),

但会产生崩溃弹窗/报告噪音,并污染每日统计。优先级低于启动/运行期崩溃。