我想找出所有被调用的'中的所有活动变量。在异常期间堆叠帧。
例如,请考虑以下示例来说明方案
import time
def mainFunc():
now = time.time()
author = "me"
callClient()
def callClient():
message = "Hello, World!"
to = "stackoverflow.com"
callNoOp()
callException()
def callNoOp():
subject = "Question in stack trace"
print "No-op"
def callException():
question = "What do I do?"
raise Exception("Vishwanathan, vellai vendum!")
mainFunc()
异常最高可达callClient
。我想看看那时的所有活动变量。 locals()
会帮助我满足这一要求。
我还想知道的是message
和to
callException()
的价值。以及引发异常时question
的值。
我已经完成了traceback
module docs。它似乎打印堆栈跟踪,但不打印那些堆栈帧中的活动变量。
答案 0 :(得分:2)
回溯由一串对象组成,通过tb_next
属性链接在一起。每个回溯对象也通过tb_frame
链接到框架,每个框架都有f_locals
属性。
给定一个追溯对象,您可以使用以下链接打印链中的所有本地人:
current = traceback
while current is not None:
print current.tb_frame.f_locals
current = current.tb_next
请参阅Python Datamodel的Standard type hierarchy section(向下滚动到 Traceback对象)。
您还可以查看inspect.trace()
utility function,它将链解包为一系列命名元组:
import inspect
for frame_info in inspect.trace():
print frame_info[0].f_locals
确保明确清除对回溯的任何引用;因为回溯包含对当前命名空间的引用,所以在此处创建循环引用几乎是微不足道的。最好是延迟清除这些引用,在最坏的情况下,循环中涉及一个带有__del__
方法的对象,然后垃圾收集将永远不会破坏该循环并且您有内存泄漏。
答案 1 :(得分:1)
我已经能够找到暂时的解决方法,看起来就像这样。
def mainFunc():
now = time.time()
author = "me"
try:
callClient()
except:
tb = sys.exc_info()[2]
while tb:
print tb.tb_lineno, "@", tb.tb_frame.f_locals
tb = tb.tb_next