从陷入困境的python进程中获取stacktrace

Ben*_*end 6 python debugging zope infinite-loop

我必须运行一个传统的Zope2网站,并对此有一些不满.最大的问题是,它偶尔会锁定,以100%的CPU负载运行而不再响应请求.虽然这个问题不能定期重现,但是有时会有一个包含3个动态图形的页面触发它,所以我怀疑某种竞争条件会导致无限循环或陷入忙碌状态.

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

是否还有另一种可能性来确定卡住的过程究竟在哪里?

Sea*_*ean 5

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

首先,您需要安装gdb。

# Redhat, CentOS, etc
$ yum install gdb

# Ubuntu, Debian, etc
$ apt-get update && apt-get install gdb
Run Code Online (Sandbox Code Playgroud)

然后,安装吡a石。

$ pip install pyrasite
Run Code Online (Sandbox Code Playgroud)

使用ps或其他方法找到卡住的python进程的进程ID并pyrasite-shell与其一起运行。

# Assuming process ID is 12345
$ pyrasite-shell 12345
Run Code Online (Sandbox Code Playgroud)

您现在应该看到一个python 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 ''
Run Code Online (Sandbox Code Playgroud)

  • 当我这样做时,pyrasite-shell 也会挂起 (4认同)

aby*_*byx 0

如果进程卡在没有其他信号通过的方式,您可能需要考虑从调试器运行它,而不是尝试在运行时附加到它。

此外,它可能对其他调试策略有用,例如关闭代码的某些部分以找出仍可重现的最小情况,以便更好地了解导致其发生的原因。