You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 04:17:32