VizTracer 0.5.0,让VizTracer成为你的行车记录仪!

0.5.0比想象中来的要快,这个minor只经历了两个micro。主要原因是这个minor主要都在底层结构上下功夫,所以动的东西比较多,于是就直接升minor了。

照例,我们还是先说最重要的改动。这个改动是直接影响了VizTracer的使用方向的。我之前对VizTracer的思考,基本都是通过对细节的展示去做profiling,但是我昨天睡觉之前忽然想到,这些细节或许在出状况的时候更有价值。

让我们想象一个行车记录仪。它一直开着,没事的时候没人去看它,但是一旦有事故发生,它会记录下最近的一段时间的情况,以及事故发生时候的具体信息。

这是VizTracer强大的地方,也是现在几乎没有成熟的解决方案的地方。在找bug的时候,有的人喜欢打log,有的人喜欢调试器,但是VizTracer可以把bug发生前发生的所有数据全都可视化在你面前。而记录的时间,则由你buffer的大小决定。

要完成这个事情,首先得把底层的buffer变成一个circular buffer,让它不断地记录数据。这个事情不算简单,也不算太难。主要是实现上有不少细节要注意。在实现得过程中还让我发现了几个之前没发现的garbage collection相关的问题。

其次,对于原来“先发生的function先进buffer”的方式要进行改变。因为我们可能不再拥有全部数据,所以改成了“先结束的先进buffer”。再配合上一个stack(最后还是实现了一个轻的stack),就可以尽可能地保留离“现在”更近的数据了。

在经历了这次改动之后,对于任意大的程序,你都可以挂个VizTracer,然后在你觉得情况不对的时候(比如catch了一个Exception,或者进入了不该进的code)直接存report,然后就可以看到当时到底发生了什么啦。

当然,为了配合这个新的领域,VizTracer也增加了一些实用的功能。

首先是fork_save ,它可以让你fork出去一个process去存数据,因为保存的过程可能需要一定的时间,这样可以避免对你主进程的影响。

和它一起出现的还有一个新的decorator,@trace_and_save,可以挂在一个你感兴趣的函数上,函数每次运行,都会产生一个report,和logging有点像。

然后现在VizTracer可以输入save_on_exit,可以在你程序退出的时候自动保存log。这对于一些在debug自己的程序跑着跑着忽然因为一个Exception或者别的什么崩出来的情况是很有帮助的。另外在command line模式下这是自动开着的。也就是说即便你的程序崩了,也会有崩之前的log。

另外还加了一个和log有关的功能,现在可以通过log_return_value来自动保存python函数的return结果了。这个会对overhead造成一定的影响,但是如果在debug中很想track各个函数的返回值的话,算是个方便的功能。

还有个底层的变化是现在tracer的信息不再是global的了,也就是说,在一个process下的各个tracer不会互相打架了。但是同一个process同时最多只能跑一个tracer,这是setprofile的局限性导致的。

欢迎大家试用VizTracer!多多提出宝贵意见哈!


https://github.com/gaogaotiantian/viztracergithub.com

编辑于 08-31

文章被以下专栏收录