断点法的使用
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.
我是 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.