事实证明,可以从回溯对象中提取变量。
要手动提取值:
ipdb> !import sysipdb> !tb = sys.exc_info()[2]ipdb> p tb.tb_next.tb_frame.f_locals{'y': 0, 'x': 2}更好的是,您可以使用异常来对该堆栈进行事后调试:
import sysdef boom(x, y): x / ydef main(): x = 2 y = 0 boom(x, y)if __name__ == '__main__': try: main() except Exception as e: # Most debuggers allow you to just do .post_mortem() # but see https://github.com/gotcha/ipdb/pull/94 tb = sys.exc_info()[2] import ipdb; ipdb.post_mortem(tb)
这使我们直接进入有问题的代码:
> /tmp/crash.py(4)boom() 3 def boom(x, y):----> 4 x / y 5ipdb> p x2



