Python调试日志工具跟踪程序完成后的执行情况?

时间:2013-01-09 17:23:18

标签: python debugging logging traceback

我想构建一个工具,我可以在推出用于测试的新代码时调用它来捕获和评估所有执行行并将它们打印到文件中,以便在执行完成后很长时间跟踪和调试它。将其视为一个调试器,它评估每行代码的返回并打印该行代码加上另一列中该行的返回值,因为它也在运行代码。例如:

Timestamp           File-Line    Source Code                       Debug Watcher        
----------------    ---------    -------------------------------   -----------------
20130109-10:18AM    test.py-1    import mathy  
20130109-10:18AM    test.py-2    x = 1        # inline comments   return: x:1
20130109-10:18AM    test.py-3    ans = divide(x,2)                call: math_functions.py-55:divide(dividend:1, divisor:2) 
20130109-10:18AM    mathy.py-56     return divedend / divisor     divide() function return: 0.5
20130109-10:18AM    test.py-4    print "Got %d"%ans               call: print : "Got 0.5"
etc...

您是否看到在执行单独的函数,文件等时如何执行?这有可能产生大量的日志数据,因此可以将其剪裁到某个限制大小。我还必须对大型数据结构进行研究,例如dicts,数组等,并创建一些特殊情况来处理这类事情。

我在使用traceback之前创建了类似的东西,但它从来没有完全正确。只是想知道是否已经存在更多抛光的东西。如果没有,你会怎么做?感谢。

1 个答案:

答案 0 :(得分:1)

我建议调查两个地方:跟踪装饰器和sys.settrace。

跟踪装饰器

我正在使用这种方法来调试生产代码。请注意,它不会记录每行执行的python代码,也不会评估每个涉及的变量。但是对我的任务来说足够了 - 它记录每个函数调用,传递参数和返回值。 它使用日志框架,因此您可以配置此信息的位置 - 屏幕,日志文件等。 此外,您还需要将跟踪器附加到模块,类或方法,以便开始跟踪。

Trace decorator for debugging

以下是简短用法示例:

import logging
logging.basicConfig(level=logging.DEBUG)

from trace_decorator import trace, attach

class TClass(object):
    def method(self,arg=1):
        print "using TClass.method()"
        self.method2(3)

    def method2(self,arg=2):
        d=1

@trace
def main():
    t = TClass()
    t.method(2)

程序输出

DEBUG:main:>>> main()
DEBUG:DEBUG:>>> TClass.method( self = <TClass object at 0x25b87d0>, arg = 2 )
DEBUG:DEBUG:>>> TClass.method2( self = <TClass object at 0x25b87d0>, arg = 3 )
DEBUG:DEBUG:<<< TClass.method2
DEBUG:DEBUG:<<< TClass.method
DEBUG:main:<<< main

有关更多信息和用法示例,请查看link with recipe

sys.settrace

您描述的工具听起来非常像python调试器。举几个python调试器: PyDev Eclipse Plugin has nice onepdb 但是当用户在代码中选择评估某些变量的位置时,您不想进行交互式调试,而是希望在每一行上捕获程序状态。 无论如何 - python调试器将是第一个寻找实现此类工具的方法。

Python调试器使用python的sys.settrace来设置跟踪处理程序方法。 There are many discussions on stackoverflow site关于如何使用sys.settrace方法。 但是大多数人都采取预防措施来防止使用这种方法 - 容易破坏你的程序,使用它会使你的程序运行得很慢。

这是一个基于sys.settrace的python跟踪工具 - 您可以尝试使用它。请注意你需要python 2.7,程序应该从命令行开始,严格来说不是某些IDE或交互式shell。 https://code.google.com/p/pytracemonitor/