VSCode Python Debugger在未执行的行上执行–在执行的行上执行

时间:2020-04-01 16:25:14

标签: python visual-studio-code vscode-debugger

我正在研究一个Python项目,并且我经常使用VS Code Python调试器,使用断点或仅使用跨步/进入工具来了解我的代码如何执行。

在对单个Python文件进行了一些更改之后,调试器开始表现异常。 虽然脚本本身按预期执行(基于日志和预期的副作用),但是当我使用调试器逐步浏览脚本时,它会跳过显然正在执行的行,并停止运行显然没有执行的行。

例如,在设置了早期断点并仅使用“ Step Over”来浏览脚本的执行后,调试器依次突出显示了以下几行:

  1. 一条if语句(正常[预计根据变量值解析为true])
  2. if块的每一行(正常)
  3. 对应的else块的第一行(不正常)-不会停止else语句本身(也不正常)
  4. try块的第二行,不停止在try语句本身上,也不停止在try块的第一行(不正常),也没有停止在上述else块中的任何其他行上

...(多行)

  1. if块的第二行,if语句将其解析为false,而不是停止在if语句本身或if语句的第一行(不正常)
  2. finally块的第二行,不停止在else语句或与上述语句相对应的else块(不正常)-或在finally行本身上,或在finally块的第一行(不正常) )

同样,我可以清楚地看出这不是代码的执行方式。参考上面的第5步和第6步:在else情况下,代码生成电子邮件,而在if情况下,代码不生成电子邮件。

如果我将文件恢复为以前的状态,则调试器将正常运行。使用git diff,我可以知道以前的版本与此版本之间在块,括号,空格等方面没有区别。

我错过了什么吗?我不相信我以前从未遇到过这个问题。

  1. 我不了解更改代码将如何改变调试器的行为
  2. 这个问题使调试器对我理解代码行为的意图基本上没有用。

2 个答案:

答案 0 :(得分:0)

我将尝试解释,假设您拥有代码:

1 if True:
2     if False:
3         a = 1
4 else:
5     b = 2
6 try:
7     c = 3

然后使用调试器运行Python,它在第一行停止。 接下来,您在IDE中删除第二行并获得实际代码:

1 if True:
2     a = 1
3 else:
4     b = 2
5 try:
6     c = 3

许多框架在开发模式下使用看门狗在源文件发生更改时自动重新加载项目(一些调试器也可以针对特定的更改模块即时执行此操作)。但是,如果您的编辑未触发重新加载Python,则会出现脚本按顺序执行行的情况:

  • 1(如果为True)
  • 2(如果为假)
  • 4(其他)
  • 6(尝试)

并且IDE将在这些行上停止,但声明错误:

  • 1(如果为True)
  • 2(a = 1)
  • 4(b = 2)
  • 6(c = 3)

答案 1 :(得分:0)

我看到了完全相同的问题(调试期间似乎跳过了行等),这可能是由于ptvsd无法与实际的最新源文件一起使用。通过设法将以下内容添加到我的工作区设置中,我设法解决了这个问题:

"python.experiments.optOutFrom": [
    "PtvsdWheels37 - experiment"
],

在没有上述解决方法的情况下,该问题对我来说偶发地出现了-我无法确切地确定发生的时间。我已经为此创建了问题https://github.com/microsoft/vscode-python/issues/11716

相关问题