2009-11-23 174 views
6

我必須運行一個傳統的Zope2網站,並對它有一些不滿。最大的問題是,它偶爾會鎖定,以100%的CPU負載運行,而不再回應請求。雖然問題不能定期重現,但有時包含3個動態圖表的頁面會觸發它,所以我懷疑會導致無限循環或卡住的忙碌等待狀態。從卡住的python進程獲取堆棧跟蹤

問題是,我還沒有找到調試這個東西的方法。 Zope日誌中沒有任何內容,系統日誌中沒有任何內容。我試圖從this question得到一個堆棧跟蹤的建議,但唯一有效的信號是SIGKILL

有沒有另一種可能性,以確定哪裏確切的過程是什麼時候卡住?

回答

0

如果過程是停留在一種方式,沒有其他信號獲得通過,你可能要考慮從調試器中運行,而不是試圖在運行時連接到它,它,。

而且,它可能是其他調試戰術有用的,像關閉代碼的某些部分,以找出它仍然是可重複的,以看是什麼原因導致它更好的最小情況。

2

見我的回答對this SO question,使用Products.signalstack。它在產品註冊時註冊與您已經找到的答案相同的處理程序。也許它對你更好。

如果沒有,你可能有你的手OS級的I/O問題,你唯一的希望是在GDB連接這個過程。搜索堆棧溢出爲gdb答案;這裏有豐富的信息!

+1

+1另外** pstack **和** lsstack **可能有些用處。 – 2010-02-19 18:15:45

0

轉轉互聯網運行了一段時間,我終於在這裏結束了之後:http://podoliaka.org/2016/04/10/debugging-cpython-gdb/ - 詳細描述了所有的部分是如何結合在一起的。我的貨幣報價是'gdb /usr/bin/python -p $ PID' - 爲了讓gdb找到正確的調試信息文件,可執行文件的名稱是必需的。

2

可以打印使用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 

你現在應該看到一個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 ''