我必须运行一个旧版 Zope2 网站,并对它有一些不满。最大的问题是,有时它会锁定,以 100% CPU 负载运行并且不再响应请求。虽然该问题无法定期重现,但包含 3 个动态图的页面有时会触发该问题,因此我怀疑某种竞争条件会导致无限循环或卡住的 busywait。

问题是,我还没有找到调试这个东西的方法。Zope 日志中没有任何内容,系统日志中也没有任何内容。我尝试了来自的建议 这个问题 获得堆栈跟踪,但唯一有影响的信号是 SIGKILL.

是否还有另一种可能性可以找出进程卡住时到底在哪里?

有帮助吗?

解决方案

如果该过程被卡的方式,没有其他信号获得通过,你可能要考虑从调试器中运行,而不是试图在运行时连接到它,它,。

此外,它可能是其他调试战术有用的,像关闭代码的某些部分,以找出它仍然是可重复的,为了看看有什么更好的原因造成的最小的情况下。

其他提示

可以使用打印出一个不错的堆栈跟踪 pyrasite

首先,你需要安装GDB。

# Redhat, CentOS, etc
$ yum install gdb

# Ubuntu, Debian, etc
$ apt-get update && apt-get install gdb

然后,安装pyrasite。

$ pip install pyrasite

使用ps或一些其它方法来找到用于卡住蟒进程的进程ID,并运行它pyrasite-shell

# Assuming process ID is 12345
$ pyrasite-shell 12345

您现在应该看到蟒蛇REPL。运行在REPL下面看堆栈跟踪的所有线程。

import sys, traceback
for thread_id, frame in sys._current_frames().items():
    print 'Stack for thread {}'.format(thread_id)
    traceback.print_stack(frame)
    print ''

请参阅我的回答 这个问题, , 使用 产品.signalstack. 。它会在产品注册时注册与您已找到的答案相同的处理程序。也许它更适合你。

如果没有,您可能遇到了操作系统级 I/O 问题,您唯一的希望就是将 gdb 附加到进程。在 Stack Overflow 中搜索 gdb 答案;这里有丰富的信息!

您可以尝试一个调试器附加到正在运行的进程。另请参见这个问题

一会我终于在这里结束了在圈子互联网四处奔波后:的 http://podoliaka.org/2016/04/10/debugging-cpython-gdb/ - 详细介绍了所有的部分是如何结合在一起的。钱报价对我来说是“gdb的的/ usr / bin中/ Python的 -p $ PID” - 为了需要gdb来找到正确的调试信息的文件的可执行文件的名称

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top