顯示正在運行的Python應用程序的堆棧跟蹤

我有這個Python應用程序不時被卡住,我沒法找到在哪裏。 html

有沒有辦法告訴Python解釋器向您顯示正在運行的確切代碼? python

某種即時堆棧跟蹤? git

相關問題: github


#1樓

我將一些附加到正在運行的Python進程中的工具一塊兒攻擊並注入一些代碼來獲取Python shell。 shell

見這裏: https//github.com/albertz/pydbattach ide


#2樓

我正在尋找一段時間來調試個人線程,我在這裏找到了感謝haridsv。 我使用traceback.print_stack()使用稍微簡化的版本: 工具

import sys, traceback, signal
import threading
import os

def dumpstacks(signal, frame):
  id2name = dict((th.ident, th.name) for th in threading.enumerate())
  for threadId, stack in sys._current_frames().items():
    print(id2name[threadId])
    traceback.print_stack(f=stack)

signal.signal(signal.SIGQUIT, dumpstacks)

os.killpg(os.getpgid(0), signal.SIGQUIT)

爲了個人須要,我也按名稱過濾線程。 spa


#3樓

python -dv yourscript.py .net

這將使解釋器以調試模式運行,併爲您提供解釋器正在執行的操做的跟蹤。 線程

若是您想以交互方式調試代碼,您應該像這樣運行它:

python -m pdb yourscript.py

這告訴python解釋器使用模塊「pdb」運行你的腳本,這是python調試器,若是你運行它就像解釋器將以交互模式執行,就像GDB同樣


#4樓

traceback模塊有一些很好的功能,其中包括:print_stack:

import traceback

traceback.print_stack()

#5樓

>>> import traceback
>>> def x():
>>>    print traceback.extract_stack()

>>> x()
[('<stdin>', 1, '<module>', None), ('<stdin>', 2, 'x', None)]

您還能夠很好地格式化堆棧跟蹤,請參閱文檔

編輯 :爲了模擬Java的行爲,正如@Douglas Leeder所建議的那樣,添加:

import signal
import traceback

signal.signal(signal.SIGUSR1, lambda sig, stack: traceback.print_stack(stack))

到應用程序中的啓動代碼。 而後,您能夠經過將SIGUSR1發送到正在運行的Python進程來打印堆棧。

相關文章
相關標籤/搜索