我想构建一个工具,我可以在推出用于测试的新代码时调用它来捕获和评估所有执行行并将它们打印到文件中,以便在执行完成后很长时间跟踪和调试它。将其视为一个调试器,它评估每行代码的返回并打印该行代码加上另一列中该行的返回值,因为它也在运行代码。例如:
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之前创建了类似的东西,但它从来没有完全正确。只是想知道是否已经存在更多抛光的东西。如果没有,你会怎么做?感谢。
答案 0 :(得分: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
有关更多信息和用法示例,请查看link with recipe。
您描述的工具听起来非常像python调试器。举几个python调试器: PyDev Eclipse Plugin has nice one) pdb 但是当用户在代码中选择评估某些变量的位置时,您不想进行交互式调试,而是希望在每一行上捕获程序状态。 无论如何 - 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/