PySide6(v6.7.0)报错仅显libc++abi信息,如何获取Python崩溃报告?
PySide6崩溃时获取有效Python日志的方法
问题背景
使用PySide6 v6.7.0开发应用时,程序崩溃仅输出libc++abi: Pure virtual function called!,无法定位问题;但通过pdb单步执行时,能看到object has no attribute这类有意义的Python异常信息。系统崩溃调用栈如下:
0 libsystem_kernel.dylib 0x1880095f0 __pthread_kill + 8 1 libsystem_pthread.dylib 0x188041c20 pthread_kill + 288 2 libsystem_c.dylib 0x187f4ea30 abort + 180 3 libc++abi.dylib 0x187ff8d08 abort_message + 132 4 libc++abi.dylib 0x187ff86e0 __cxa_pure_virtual + 24 5 QtCore 0x104a8fe10 QAbstractAnimationPrivate::setState(QAbstractAnimation::State) + 1388 6 QtCore 0x104993f04 0x1048c4000 + 851716 7 QtCore 0x104a8febc QAbstractAnimationPrivate::setState(QAbstractAnimation::State) + 1560 8 QtCore 0x104a98e14 QPropertyAnimation::~QPropertyAnimation() + 32 9 QtCore.abi3.so 0x1043e0a00 QPropertyAnimationWrapper::~QPropertyAnimationWrapper() + 56 10 QtCore 0x104a94cdc 0x1048c4000 + 1903836 11 QtCore 0x104a94be4 QAnimationGroup::~QAnimationGroup() + 40 12 QtCore.abi3.so 0x1043d54c8 QParallelAnimationGroupWrapper::~QParallelAnimationGroupWrapper() + 56 13 libshiboken6.abi3.6.7.dylib 0x102e5b9a4 SbkDeallocWrapperCommon(_object*, bool) + 344 14 Python 0x103063678 dictkeys_decref + 172 15 Python 0x1030668c0 dict_dealloc + 240 16 libshiboken6.abi3.6.7.dylib 0x102e601dc Shiboken::Object::deallocData(SbkObject*, bool) + 404 17 libshiboken6.abi3.6.7.dylib 0x102e5b92c SbkDeallocWrapperCommon(_object*, bool) + 224 18 Python 0x103098b8c subtype_dealloc + 744 19 libshiboken6.abi3.6.7.dylib 0x102e5f90c Shiboken::Object::destroy(SbkObject*, void*) + 232 20 QtWidgets.abi3.so 0x1070efbf8 QGraphicsViewWrapper::~QGraphicsViewWrapper() + 56 21 QtCore 0x10498b834 QObjectPrivate::deleteChildren() + 152 22 QtWidgets 0x1090bd190 QWidget::~QWidget() + 1172 23 QtWidgets.abi3.so 0x106dd1890 QWidgetWrapper::~QWidgetWrapper() + 64 24 libshiboken6.abi3.6.7.dylib 0x102e5b9a4 SbkDeallocWrapperCommon(_object*, bool) + 344
可行解决方案
1. 全局捕获Python异常
在应用入口处添加全局异常处理器,确保Qt事件循环中触发的未捕获Python异常被完整记录:
import sys import traceback def handle_exception(exc_type, exc_value, exc_traceback): if issubclass(exc_type, KeyboardInterrupt): sys.__excepthook__(exc_type, exc_value, exc_traceback) return print("\n=== Uncaught Python Exception ===") traceback.print_exception(exc_type, exc_value, exc_traceback) sys.excepthook = handle_exception
2. 启用Qt调试日志
通过环境变量开启Qt的详细日志输出,定位C++层触发崩溃的具体原因:
- macOS/Linux:运行程序前执行
export QT_LOGGING_RULES="*.debug=true" - Windows:运行程序前执行
set QT_LOGGING_RULES=*.debug=true
3. 使用faulthandler输出Python调用栈
启用Python的faulthandler模块,崩溃时同时输出Python层面的调用栈,关联Python代码与C++崩溃点:
import faulthandler faulthandler.enable()
4. 用调试器查看混合调用栈
使用lldb(macOS)或gdb(Linux)调试进程,同时查看C++和Python层面的调用栈:
- macOS:
lldb -- python your_app.py,崩溃后输入bt查看C++栈,输入py-bt查看Python栈 - Linux:
gdb --args python your_app.py,崩溃后输入bt查看C++栈,输入py-bt查看Python栈
5. 手动管理Qt对象生命周期
从崩溃栈看问题出在动画对象析构阶段,可能是Python与Qt对象生命周期不一致导致。尝试:
- 手动调用动画对象的
deleteLater()方法,让Qt管理其销毁时机 - 避免动画对象被Python过早回收(比如将对象引用存储在全局变量或父对象中)
内容的提问来源于stack exchange,提问作者Piotr Herbut
相关产品推荐
相关产品推荐

