问题描述
|
此后,我已经找到了解决方法,但仍然想知道答案。
解决方法
追溯保留对当前线程上调用的每个函数/方法的堆栈帧的引用,从最上层的帧一直到出现错误的点。每个堆栈框架还保存对调用堆栈中每个函数时有效的局部变量和全局变量的引用。
由于没有办法让pickle知道要序列化什么和忽略什么,因此,如果您能够进行pickle的回溯,最终将对整个应用程序状态的移动快照进行pickle:当pickle运行时,其他线程可能正在修改共享变量的值。
一种解决方案是创建一个可拾取对象以遍历追溯并仅提取您需要保存的信息。
,我想您对保存完整的调用上下文(回溯+全局+每帧的局部变量)感兴趣。
这对于确定两个不同调用上下文中同一函数的行为差异,或者构建自己的高级工具来处理,显示或比较这些回溯将非常有用。
问题在于,pick不知道如何序列化本地或全局中可能存在的所有类型的对象。
我猜您可以构建自己的对象并将其保存,从而过滤掉所有不是Picklabe的对象。该代码可以作为基础:
import sys,traceback
def print_exc_plus():
\"\"\"
Print the usual traceback information,followed by a listing of all the
local variables in each frame.
\"\"\"
tb = sys.exc_info()[2]
while 1:
if not tb.tb_next:
break
tb = tb.tb_next
stack = []
f = tb.tb_frame
while f:
stack.append(f)
f = f.f_back
stack.reverse()
traceback.print_exc()
print \"Locals by frame,innermost last\"
for frame in stack:
print
print \"Frame %s in %s at line %s\" % (frame.f_code.co_name,frame.f_code.co_filename,frame.f_lineno)
for key,value in frame.f_locals.items():
print \"\\t%20s = \" % key,#We have to be careful not to cause a new error in our error
#printer! Calling str() on an unknown object could cause an
#error we don\'t want.
try:
print value
except:
print \"<ERROR WHILE PRINTING VALUE>\"
但是您可以将其添加到具有您自己的可选取表示形式的列表中(而不是打印对象)(使用json或yml格式可能更好)。
也许您想加载所有这些调用上下文,以便为您的函数重现相同的情况,而无需运行生成它的复杂工作流。我不知道是否可以这样做(由于有内存引用),但是在那种情况下,您需要将其从格式中反序列化。