我有我的模块使用这样的情况 - 在一个进程中运行很长一段时间,但有时卡住了未知和不可复制的原因。它有点哈克,并且仅适用于UNIX(要求信号): p>
要使用,只需调用在某些点上听()函数,当你的程序启动(你甚至可以把它贴在site.py将所有Python程序中使用它),并让它运行。在任何时候,发送过程中的SIGUSR1信号,使用kill或蟒蛇: P>
这将导致程序以它目前在该点突破到Python控制台,显示你的堆栈跟踪,并让你操控的变量。使用Control-D(EOF)继续运行(但请注意,你可能会中断任何I / O等你的信号点,所以它不是完全是非侵入性的。 P>
我有另外一个脚本,做同样的事情,但它通过管道运行的进程通信(允许调试后台运行的进程等)。它有点大,张贴在这里,但我已经添加了其作为蟒蛇菜谱食谱。 P>
要安装一个信号处理程序的建议是一个很好的,我用了很多。例如,BZR通过默认情况下安装一个SIGQUIT处理程序调用 立即放弃你到一个PDB提示。 (请参阅bzrlib.breakin模块的源的具体细节。)使用PDB,你不仅可以获取当前栈跟踪,也检查变量等。 P>
不过,有时我需要调试,我没有必须安装在信号处理先见之明的过程。在Linux上,你可以gdb连接到过程,并得到一个蟒蛇堆栈跟踪一些GDB宏。把http://svn.python.org/projects/python/trunk/Misc/gdbinit在,则: P>
- 附加GDB: 的 em>的 LI>
- 下载的是Python堆栈跟踪: li> ul>
这不是完全可靠的不幸,但它工作的大部分时间。 P>
最后,连接 往往可以给你一个好主意,什么过程正在做什么。 P>