我的应用程序最近在客户端的计算机上崩溃了.我怀疑这是因为PyQt自己的内存管理,如果处理不当会导致内存访问无效.
当Python像这样崩溃时,不会打印回溯,只会将数据转储写入磁盘.
有没有可能找出崩溃发生在Python代码中的哪个位置?
这是转储:http://pastie.org/768550
这是一个linux核心转储吗?如果是这样,你可以用gdb检查它.您需要在具有相同操作系统和Python版本的系统上运行,包括第三方库.跑gdb -c /path/to/core/file
.加载gdb后,该命令bt
将列出主线程thread apply all bt
的堆栈跟踪,并列出所有线程的堆栈跟踪.
这将有多大取决于Python的版本是否包含完整的符号表(即Python的调试版本) - 如果不是,那么您将只看到地址作为主要C入口点的偏移量.然而,这仍然可以用于诊断出错的地方.
如果它是其他一些不支持gdb的操作系统那么你就是自己 - 可能是操作系统会有自己的调试工具.
编辑:
Python维基上有一个页面,描述了如何使用gdb获取python堆栈跟踪.
但是,快速查看问题中的链接表明操作系统是Windows,因此gdb没有用.Windows转储中的信息很少,所以我认为你运气不好.
我唯一的建议是:
尝试在内部重现崩溃.
让用户在运行一个可以捕获崩溃的工具并执行适当的内存转储时重现该错误.自从我完成严格的Windows调试以来已经过去了十年,所以我不知道现在有哪些工具可用 - 曾经有一个名为Dr.Watson,但它可能已经过时了.
如果用户无法重现崩溃,那么你运气不好,另一方面,如果它再也不会发生,那就不是那么大的问题了.;-)
更新:
Google告诉我,Watson博士仍然是Windows XP上的默认崩溃处理程序(可能是其他版本的Windows) - 问题中链接的堆栈转储可能来自它.但是,Dr Watson保存的默认数据相当少,但您可以将其配置为保存更多 - 请参阅此文章.简而言之,如果您运行drwtsn32 -i
它将弹出一个对话框,让您设置选项.