Python程序员Visual Studio Code指南5调试

打印 上一主题 下一主题

主题 849|帖子 849|积分 2547

5 调试

当运行程序时终端输出错误时,可以参考编辑器中的"题目"面板来办理碰到的题目。不过,并非全部错误都会导致错误。可能出现的情况是,程序执行成功,但输出结果与预期不同。出现这种情况时,下一步就是找出程序中的错误。这个过程被称为调试。
您可以实验通过注释代码行(从而克制代码块运行)、添加更多打印语句以在代码块执行后输出,或修改程序中的行来定位和办理题目。虽然每种方法都能帮助你找出错误和可能的修复方法,但这一过程服从很低。
Visual Studio Code有内置调试器,它的功能通过Python扩展得到了进一步扩展。虽然调试器可以帮助您辨认和修复错误,但您仍有责任辨认错误可能出如今代码的哪个位置。一旦你确定了错误的潜在位置,就可以使用调试器来帮助你跟踪程序的执行状态。
5.1 启动调试

要让调试器在执行过程中暂停,必须在代码的某一行设置断点。只要你想检查程序的运行状态,然后逐行检查代码,就可以设置断点。在 Visual Studio 代码中,断点会以红点的形式出如今编辑器空缺处。当调试会话开始时,调试器会执行到断点为止的全部代码行,并高亮显示要执行的下一行。(如果是步进操作,则例外,这将在背面的 "调试下令 "一节中表明)。

要添加断点,请将鼠标悬停在当前代码行的编辑器边框上,然后单击以添加断点。大概,使用键盘快捷键F9来添加当前代码行。要移除断点,请在编辑器空缺处选择断点,或再次按F9键。也可以在顶部菜单中选择运行,然后选择移除全部断点,从而移除全部断点。
你可以在会话期间暂停调试器的任何位置调用debugypy.breakpoint()来强制设置断点。如果要强制设置断点,必须在代码中导入debuypy。调用后,调试器会克制下一行代码。这种方法会在程序中硬编码断点。如果你有一些异步的回调函数,而你又不想用其他断点来设置、清除、启用或禁用它们,那么这种方法可能会很有效。通过对几个断点举行硬编码,就能在回调函数发生时捕捉到它们。
您可以通过以下方式启动调试会话:

  • 菜单: 选择运行 ➪ 启动调试。
  • 键盘快捷键: 按 F5。
  • 运行视图: 单击运行和调试


  • 运行视图: 单击 "开始调试"(在调试会话启动后出现)

编辑器在调试会话期间的行为由调试配置控制。调试配置是调试器功能的设置列表。Python 扩展提供了几种配置,稍后将在 "启动配置 "中探讨。本章练习中出现提示时,点击 Python 文件配置,调试当前活动的 Python 文件。

启动调试会话后,会打开运行视图。运行视图用于管理调试会话。当调试会话处于活动状态时,"运行 视图中的面板会根据正在执行的内容动态变化。

当代码中添加断点时,断点面板会将模块名称(如times_two.py)及其相应的断点行添加到列表中。目前times_two.py 中有两个断点,一个在第4行,另一个在第6行。在断点面板中选择其中一个断点,编辑器就会高亮显示该断点。

假设你在程序中设置了多个断点。在调试时,你决定在会话中只选择一些断点,这样就不必在每个断点都暂停调试器了。移除不需要的断点会删除断点,如果你打算在后续调试会话中保存断点,这可能不是你的本意。相反,你可以禁用断点。在 "断点"面板中,取消选中断点旁边的方框即可禁用断点。大概,你也可以右键单击断点,然后单击禁用断点。如果想一次性禁用全部断点,可以单击"停用断点"按钮。不过,如果您想删除全部断点,请单击"删除断点"按钮。删除全部断点有助于确保清除程序中设置的全部断点。

调试器运行时,变量的当前状态会反映在变量面板中。变量面板将变量分为局部和全局范围。

在继续调试的过程中,请注意面板中变量的变化情况。虽然变量会随着程序的执行而添补,但变量值有可能会产生错误,从而导致代码克制执行。如果你发现换一个值就能继续执行程序,你可以在变量面板中更改该值。要更改数值,请选中变量并按Enter键。输入新变量后,再按一次Enter键,将修改后的值保存到程序状态中。
5.2 调试下令

除运行视图外,编辑器中还会出现调试工具栏(见图 5.9)。调试工具栏提供了对这些调试下令的快速访问:

  • A—Continue (F5)
  • B—Step Over (F10)
  • C—Step Into (F11)
  • D—Step Out (Shift+F11)
  • E—Restart (Shift+Cmd/Ctrl+F5)
  • F—Stop (Shift+F5)

调试下令是一起工作的,而不是独立的;也就是说,你通常要使用多种下令的组合来调试不同的代码行。
除调试工具栏下令外,编辑器右键上下文菜单中还提供了其他下令。这些功能包括

  • 添加内联断点(Add Inline Breakpoint)-在代码中添加断点,特别是在光标下的代码中。这对单个语句中的复合表达式非常有效,因为您希望在表达式的特定部分断开。大概,您可以导航到运行 ➪ 新断点 ➪ 内联断点,大概使用键盘快捷键 Shift+F9。
  • 运行到光标(Run to Cursor)-运行一段代码而不设置另一个断点。
  • 跳转到光标(Jump to Cursor)-跳转代码行或返回并重复代码行。
5.2.1 Continue

当调试器停在某个断点时,单击"继续(Continue)"会运行该断点后的全部代码,直到下一个断点或程序结束。
5.2.2 Step Over

Step Over下令运行调试器当前暂停的代码行,然后自动暂停到下一行,无需另设断点。如果当前行是函数调用,调试器将运行整个函数,然后在函数调用后的下一行暂停。从本质上讲,Step Over下令是在当前范围内逐行举行调试。
试试看 运行调试器,逐行查看代码。注意,当调试器运行到 times_two() 函数定义处时,调试器的下一步是 print() 语句。
5.2.3 Step Into

当调试器在函数处暂停时,Step Into 下令会进入函数作用域。在这里,你可以查看函数作用域内的每一行,还能进入其他函数调用。

5.2.4 Step Out

如果发现自己想从函数内部退出到调用该函数的作用域,可以使用Step Out下令。
5.2.5 克制

在调试会话期间,可以使用Stop下令克制全部执行。克制会话会克制调试器,但不会结束程序。如果在调试会话期间发现了程序中的错误,并得出结论:如果继续执行,可能会产生影响程序的副作用,例如覆盖错误的文件。在这种情况下,请选择克制下令退出调试器。
5.2.5 重新启动

在调试和纠正程序中的错误时,你往往不想继续在当前(通常是错误的)状态下运行程序。这时,你需要克制执行并重新启动调试程序。重启(Restart)下令可以方便地克制调试器,保存当前文件,然后用最近的修改重新启动调试器。
参考资料

5.3 调用堆栈

模块及其函数调用被称为框架。帧相互堆叠,当函数返回时,相应的帧会从堆栈中清除。以times_two.py程序为例,模块框架位于栈的底部,而times_two()函数框架位于栈的顶部。如果times_two()函数举行函数调用,被调用的函数将位于栈顶。调用栈自己被称为调用栈。
调试视图中的调用栈面板显示了导致当前执行点的整个函数调用链。调用栈面板列出了正在调试的文件和文件中正在运行的行。如果调用经过项目中的其他文件,调用堆栈尤其有效,因为调用堆栈会记录你在调试链中的位置。

此外,如果处于断点处,可以选择调用堆栈中的某一帧,变量面板会显示堆栈中该断点处的程序状态。这对于通过堆栈和生成该值的全部代码追溯错误值的源头非常有效。

逐行查看代码,直到调用times_two()函数。进入函数并注意调用堆栈。如今,times_two()框架已添加到调用堆栈中

调试器完成函数调用并返回总数后,times_two()框架将从调用栈面板中清除。
5.4 条件断点(Logpoints)

你可以配置断点,使其在特定条件为真时触发(条件断点),或在断点被触发一定次数后触发。
当你为断点指定的表达式求值为真时,条件断点就会断开。例如,如果要调试数据库中的数据,可以在出现特定记录时中断。
命中计数使调试器能够执行到指定的出现次数。Python扩展支持的命中计数是前面带有 、>、>=、 2 时的 elif 语句中,i == 1 似乎有题目。可以以为程序中的错误就出在这里。

  • 在i == 1处设置断点并启动调试器。出现提示时,输入3。
调试器在断点处暂停后,查看变量面板,确认变量是否反映了适当的值。


  • Step over到 while 循环的最后一行
注意到尽管已经生成了所需的斐波纳契数,循环仍开始了另一次迭代。继续跳过 while 循环,程序会生成相同的斐波纳契数,而且 while 循环从未中断过。该程序是一个无限循环。


  • 启动调试器并打开调试控制台
调试器在断点处克制后,输入i+=1 以递增 i 的值。
在变量面板中,i 的值从 1 变为 2。 如今,继续调试程序时,执行代码的其余部分,只生成三个斐波那契数字。
5.7 启动配置

启动配置可让你配置不同调试会话的运行方式,并将这些配置长期保存在 launch.json 文件中。launch.json 文件保存在项目根目次下的 .vscode 文件夹中,也可在用户或工作区设置中访问。要举行调试,launch.json 文件中至少需要一个配置。
要创建 launch.json 文件,请在运行视图中单击创建 launch.json 文件。大概,你也可以从 "运行 "菜单中选择 "运行" ➪ "打开配置 "来创建 launch.json 文件。
Visual Studio Code会从下令面板打开配置菜单,提示您选择默认配置作为新配置的启动模板。

Python 扩展提供了以下默认配置:

  • Python 文件-调试当前活动的 Python 文件。
  • 模块-通过使用 -m 调用 Python 模块来调试该模块。
  • 远程连接-为调试服务器监听提供主机名和端标语。
  • 使用进程 ID 附加-当运行在 Visual Studio Code 之外启动的 Python 脚本时,将调试器附加到非调试模式下的 Python 进程。附加到进程需要进程 ID。
该扩展还为网络应用程序提供了三种默认配置:

  • Django
  • Flask
  • Pyramid
要了解有关调试Django应用程序的更多信息,请参阅代码.visualstudio.com/docs/python/tutorial-django#_explore-the-debugger 的Django教程。要了解有关调试 Flask 应用程序的更多信息,请参阅位于 code.visualstudio.com/docs/python/tutorial-flask#_run-the-app-in-the-debugger 的 Flask 教程。
选择启动模板后,launch.json文件将添加到 .vscode 文件夹中,并在编辑器中打开。

编辑 launch.json 文件时,IntelliSense 会提示(Ctrl+空格键)可用属性列表。您也可以对文件中的全部属性使用悬停帮助。由于不同语言的属性可能不同,使用悬停帮助可以了解有关属性的更多信息。
launch.json 文件可以包含任意数量的配置。要添加配置,请从运行菜单或 launch.json 编辑器中单击添加配置。

这里提供了 launch.json 文件可用的核心设置:

  • name -为出如今 Visual Studio 代码下拉列表中的调试配置提供名称。
  • type-指定要使用的调试器类型;对于 Python 代码,将其设置为 python。
  • request-指定开始调试的模式:

    • launch: 在程序中指定的文件上启动调试器。
    • attach(附加): 将调试器附加到远程服务器上已经运行的进程上,该进程不能随意重启。当地需要与程序中指定的相同的源代码文件。

  • program-提供 Python 程序入口模块(启动文件)的完整路径。默认配置中经常使用的 ${file} 值,会使用编辑器中的当前活动文件。通过指定启动文件,可以确保无论打开哪个文件,都能以相同的入口点启动程序。
  • python- 指向用于调试的 Python 表明器的完整路径。如果未指定,则默认使用 python.pythonPath 设置中指定的表明器,相当于使用 ${config:python.pythonPath} 值。要使用其他表明器,请在调试配置的 python 属性中指定其路径。
  • args-指定通报给程序的参数。参数字符串中以空格分隔的每个元素都应包含在引号中。
  • cwd-指定调试器的当前工作目次,它是代码中使用的任何相对路径的基本文件夹。如果省略,当前工作目次默以为${workspaceFolder},即编辑器中打开的文件夹。大概,也可以使用在每个平台上定义的自定义环境变量,其中包含要使用的 Python 表明器的完整路径,这样就不需要额外的文件夹路径了。
其他配置请访问 code.visualstudio.com/docs/python/debugging#_set-configuration-options。还有一些非Python 特有的附加属性,可以在 launch.json 中设置。要了解更多信息,请参阅 code.visualstudio.com/docs/editor/debugging#_launchjson-attributes。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

涛声依旧在

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表