多线程 python 脚本静默死亡 - 如何调试

Posted

技术标签:

【中文标题】多线程 python 脚本静默死亡 - 如何调试【英文标题】:Multithreaded python script silently dies - how to debug 【发布时间】:2011-02-16 20:28:44 【问题描述】:

我有一个 python 脚本,它创建并启动 3 个线程,然后进入键盘中断捕获循环,以在按下 ctrl+c 时发送线程停止信号。

线程的 run 方法有一个***的 try-except 记录每个异常,同时创建线程的***代码被包装到 try-except 以记录每个异常。

但脚本只是随机死亡,有时一天后,有时一个小时后,没有任何异常被记录。

这让我发疯,因为我不知道如何调试它。

各位有什么想法吗?

编辑: 正如 Luper 建议的那样,查看 syslog 确实揭示了

python[27737]: segfault at 0 ip 0808e1d3 sp b662c5e0 error 4 in python2.5[8048000+fb000]

还是不知道怎么走。

至于代码,它没有做任何花哨的事情,一些文件解析和目录之间的复制,以及通过os.system调用一些可执行文件

【问题讨论】:

你能发布一些示例代码吗? 在 syslog 中查找段错误等? 【参考方案1】:

python 中的段错误通常是由用 C 编写的模块中的错误引起的。解释器无能为力。

快速搜索发现导致段错误的常见问题是 1) 内存错误(但您应该会看到更多段错误 - 如果您怀疑这一点,请从 live CD 运行 memcheck),2) 安装损坏(尝试重新安装 python 和软件包,重新下载所有内容)和 3)错误(duh)。

先试试是1)还是2),然后看进程停在哪里,可以用strace记录所有系统调用。这可能会给你一些关于正在发生的事情的其他线索(输出文件可能会变大):

strace -f python my_script.py > strace.out 2>&1

【讨论】:

以上是关于多线程 python 脚本静默死亡 - 如何调试的主要内容,如果未能解决你的问题,请参考以下文章

(多线程-Python)我如何创建一个脚本来运行我通常从两个不同的终端运行的两个脚本?

Python 多线程

python多线程queue导致的死锁问题

哪些 GUI 框架最适合多线程 Python 程序?

如何让 Python 多线程管道使用 90% 的可用内存?

python多线程ssh爆破如何实现与防范?