显示正在运行的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进程来打印堆栈。

相关文章
相关标签/搜索