Python 调试器:交互式调试与硬编码断点
Python debugger: interactive debugging vs. hard-coded breakpoint
交互式调试(python -m pdb foo.py
)和硬编码断点(import pdb; pdb.set_trace()
)有什么区别。
大多数关于调试器的教程只关注特定命令的使用,但理解它会很有趣:
选择调试模式的最佳做法是什么?
它们在计算时间方面性能是否不同?
python -m pdb foo.py
会在程序开始时将您弹出到调试器中。这可能对您想要作为一个整体进行分析的非常小的程序很有用。
在更大更复杂的程序中,如果您想调查的情况是在高函数调用堆栈顶部经过大量计算之后出现的,这种用法非常不切实际。
在这种情况下,通常更容易在源代码中出现有趣情况的地方使用 import pdb; pdb.set_trace()
设置硬断点。然后你正常启动程序,它正常执行,可能会花费大量时间在没有你干预的情况下执行许多计算,直到它达到你关心的点。只有当您到达感兴趣的点时,调试器才会要求您进行干预。
关于性能:第一种情况,你必须按顺序逐条逐句执行;在第二种情况下,在您到达感兴趣的点之前不会调用调试器。
在第一种情况下,CPU几乎所有的时间都在等待人类的回应;在第二个中,它大部分时间都花在执行程序上,直到到达感兴趣的点。
交互式调试(python -m pdb foo.py
)和硬编码断点(import pdb; pdb.set_trace()
)有什么区别。
大多数关于调试器的教程只关注特定命令的使用,但理解它会很有趣:
选择调试模式的最佳做法是什么?
它们在计算时间方面性能是否不同?
python -m pdb foo.py
会在程序开始时将您弹出到调试器中。这可能对您想要作为一个整体进行分析的非常小的程序很有用。
在更大更复杂的程序中,如果您想调查的情况是在高函数调用堆栈顶部经过大量计算之后出现的,这种用法非常不切实际。
在这种情况下,通常更容易在源代码中出现有趣情况的地方使用 import pdb; pdb.set_trace()
设置硬断点。然后你正常启动程序,它正常执行,可能会花费大量时间在没有你干预的情况下执行许多计算,直到它达到你关心的点。只有当您到达感兴趣的点时,调试器才会要求您进行干预。
关于性能:第一种情况,你必须按顺序逐条逐句执行;在第二种情况下,在您到达感兴趣的点之前不会调用调试器。
在第一种情况下,CPU几乎所有的时间都在等待人类的回应;在第二个中,它大部分时间都花在执行程序上,直到到达感兴趣的点。