0

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

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...

您是否看到在执行通过单独的函数、文件等时如何跟踪执行?这有可能生成大量日志数据,因此可以将其裁剪到某个限制大小。我还必须使用大型数据结构,例如字典、数组等,并创建一些特殊情况来处理这些事情。

在使用回溯之前,我已经创建了类似的东西,但它从来没有完全正确地工作过。只是想知道是否已经存在更精致的东西。如果没有,你会怎么做?谢谢。

4

1 回答 1

1

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

跟踪装饰器

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

用于调试的跟踪装饰器

这是简短的用法示例:

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

有关更多信息和使用示例,请查看recipe 的链接

系统设置跟踪

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

Python 调试器使用 python 的sys.settrace来放置他们的跟踪处理程序方法。 stackoverflow 网站上有很多关于如何使用 sys.settrace 方法的讨论。但他们中的大多数人都有使用这种方法的预防措施——容易破坏你的程序,使用它会使你的程序运行非常缓慢。

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

于 2013-01-11T23:12:49.167 回答