我有這個Python應用程序不時被卡住,我沒法找到在哪裏。 html
有沒有辦法告訴Python解釋器向您顯示正在運行的確切代碼? python
某種即時堆棧跟蹤? git
相關問題: github
我將一些附加到正在運行的Python進程中的工具一塊兒攻擊並注入一些代碼來獲取Python shell。 shell
見這裏: https : //github.com/albertz/pydbattach ide
我正在尋找一段時間來調試個人線程,我在這裏找到了感謝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
python -dv yourscript.py .net
這將使解釋器以調試模式運行,併爲您提供解釋器正在執行的操做的跟蹤。 線程
若是您想以交互方式調試代碼,您應該像這樣運行它:
python -m pdb yourscript.py
這告訴python解釋器使用模塊「pdb」運行你的腳本,這是python調試器,若是你運行它就像解釋器將以交互模式執行,就像GDB同樣
traceback模塊有一些很好的功能,其中包括:print_stack:
import traceback traceback.print_stack()
>>> 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進程來打印堆棧。