编程语言
首页 > 编程语言> > python-如何使用traceit报告堆栈跟踪中的函数输入变量

python-如何使用traceit报告堆栈跟踪中的函数输入变量

作者:互联网

我一直在使用以下代码来跟踪程序的执行情况:

import sys
import linecache
import random

def traceit(frame, event, arg):
    if event == "line":
        lineno = frame.f_lineno
        filename = frame.f_globals["__file__"]
        if filename == "<stdin>":
            filename = "traceit.py"
        if (filename.endswith(".pyc") or
            filename.endswith(".pyo")):
            filename = filename[:-1]
        name = frame.f_globals["__name__"]
        line = linecache.getline(filename, lineno)
        print "%s:%s:%s: %s" % (name,  lineno,frame.f_code.co_name , line.rstrip())
    return traceit


def main():
    print "In main"
    for i in range(5):
        print i, random.randrange(0, 10)
    print "Done."

sys.settrace(traceit)
main()

使用此代码或类似的代码,是否可以报告某些函数参数的值?换句话说,上面的代码告诉我“哪个”函数被调用,并且我想知道这些函数调用的输入变量的对应值“什么”.

提前致谢.

解决方法:

frame.f_locals将为您提供局部变量的值,我想您可以跟踪所看到的最后一帧,如果frame.f_back不是最后一帧转储frame.f_locals.

我预计尽管如此,您很快就会被太多的数据所困扰.

这是修改您的代码来执行此操作的:

import sys
import linecache
import random

class Tracer(object):
    def __init__(self):
        self.lastframe = None

    def traceit(self, frame, event, arg):
        if event == "line":
            lineno = frame.f_lineno
            filename = frame.f_globals["__file__"]
            if filename == "<stdin>":
                filename = "traceit.py"
            if (filename.endswith(".pyc") or
                filename.endswith(".pyo")):
                filename = filename[:-1]
            name = frame.f_globals["__name__"]
            line = linecache.getline(filename, lineno)
            if frame.f_back is self.lastframe:
                print "%s:%s:%s: %s" % (name,  lineno,frame.f_code.co_name , line.rstrip())
            else:
                print "%s:%s:%s(%s)" % (name,  lineno,frame.f_code.co_name , str.join(', ', ("%s=%r" % item for item in frame.f_locals.iteritems())))

                print "%s:%s:%s: %s" % (name,  lineno,frame.f_code.co_name , line.rstrip())
                #print frame.f_locals
            self.lastframe = frame.f_back
        return self.traceit


def main():
    print "In main"
    for i in range(5):
        print i, random.randrange(0, 10)
    print "Done."

sys.settrace(Tracer().traceit)
main()

标签:python,debugging,stack-trace,trace
来源: https://codeday.me/bug/20191013/1909734.html