断点法的使用

Use of Breakpoint Method

我是 python 的新手,不确定断点方法的工作原理。它是否打开 IDE 或某些内置调试器的调试器?

此外,我想知道该调试器将如何运行。

例如,我使用Spyder,是否意味着如果我使用breakpoint() 方法,Spyder 的调试器将打开,通过它我可以打开Debugger 下拉菜单,或者其他一些调试器会打开吗?

我还想知道这个函数如何与 breakpointhook() 方法结合使用。

不,由于设置了断点,调试器不会自动打开

所以您首先设置了一个断点(或多个断点),然后手动启动调试器

此后,调试器将照常执行您的代码,但 将在到达断点时停止执行指令 - 指令 在断点本身不会执行。它会在 之前暂停 ,让您有机会执行一些调试任务,如

  • 检查变量值,
  • 手动将变量设置为其他值,
  • 继续执行指令逐步(即仅执行下一条指令),
  • 继续执行指令到下一个断点,
  • 过早地停止调试您的程序。

这是所有编程语言(及其 IDEs)的所有调试器的 常见场景。

对于 IDE 秒,启动调试器将

  • 在他们的菜单系统中启用或显示调试指令,
  • 为他们显示一个工具栏,
  • 为他们启用热键。

如果不设置至少一个断点,大多数调试器会不间断地执行整个程序(就像在没有调试器的情况下启动程序一样),因此您将没有机会执行任何调试任务。

(有些 IDE 有一个选项可以在 "first instruction, then a pause" 模式下启动调试器,所以你 不需要设置断点在这种情况下提前。)


是的,breakpoint()内置函数(在Python3.7中引入)停止执行你的程序,进入调试模式,你可以使用Spyder的调试器下拉菜单。

(它不是 Spyders 的调试器,只是 它的下拉菜单;使用的调试器仍然是 pdb,即默认的 Python DeBugger.)

breakpoint() 内置函数和 breakpointhook() 函数(来自 sys 内置模块)之间的连接非常简单 - 第一个一个直接调用第二个

自然的问题是 为什么我们需要两个行为完全相同的函数?

答案在设计中——breakpoint()函数可以间接改变,方法是改变breakpointhook() 函数。

例如,IDE 创建者可以更改 breakpointhook() 函数的行为,使其启动 他们自己的调试器 ,而不是 pdb一个。

breakpoint() 内置函数的默认行为是在此时打开 pdb 调试器。

即默认行

breakpoint()

行为应该与

相同
import pdb; pdb.set_trace()

可以通过修改 sys.breakpointhook 来自定义行为(例如打开不同的调试器)。通常,只有在实现调试器或功能类似于调试器的情况下,您才会这样做。如果您是来自 IDE 的 运行 代码,IDE 本身应该修改 sys.breakpointhook 以便它打开 IDE 调试器。 (我不知道是否所有 Python IDE 真的这样做了,但他们应该这样做。)

有关详细信息,包括添加此功能的原因,请参阅 PEP 553 proposal。实际实施已进入 Python 3.7.