简单来说最近在做回归测试的相关工作→
回归测试需要根据版本之间代码的变更选择测试用例→
尝试静态和动态生成调用图方法后选择用动态生成方法解决→
选用第三方库pycallgraph魔改了一部分算是满足了跑实验的需求→
跑的差不多了想搞清楚内部具体怎么实现插装→
有了本文
看过部分源码后发现使用了sys.settrace
进行插桩跟踪运行时的轨迹,不知怎么发现SO上的这个问题,
项目开发者在13年就实现这玩意儿了,虽然这个项目在15年就已经没继续更新,但是依然能比较好的兼容最新的python版本(大概是用到的built-in lib没啥大变化)。
跟踪函数需要接收三个参数frame
( https://docs.python.org/3/library/sys.html#sys.settrace ),event
( https://docs.python.org/3/reference/datamodel.html#types ),arg
( https://docs.python.org/3/library/sys.html#sys.settrace )。其中arg
的值与event
类型有关。
通过内省inspect
可获得代码的模块信息,包括模块路径和模块名,跟踪前设置sys.settrace(tracer)
进行跟踪,sys.settrace(None)
关闭跟踪,frame.f_locals
可以获取调用函数时参数的信息,具体更多属性可以在frame
后的链接中查找。
1 | import sys |
然后给了一个demo,让我们写的tracer跟踪它的执行。
1 | def add(a, b): |
运行结果:
完。