在异常期间从所有堆栈帧中检索所有活动变量

时间:2014-11-24 09:24:48

标签: python python-2.7

我想找出所有被调用的'中的所有活动变量。在异常期间堆叠帧。

例如,请考虑以下示例来说明方案

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()会帮助我满足这一要求。

我还想知道的是messageto callException()的价值。以及引发异常时question的值。

我已经完成了traceback module docs。它似乎打印堆栈跟踪,但不打印那些堆栈帧中的活动变量。

2 个答案:

答案 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