VSCode Python调试器在未执行的行上执行步骤,以及在执行的行上执行步骤

VSCode Python调试器在未执行的行上执行步骤,以及在执行的行上执行步骤,python,visual-studio-code,vscode-debugger,Python,Visual Studio Code,Vscode Debugger,我正在从事一个Python项目,我经常使用VS Code Python调试器,使用断点,或者只是使用step over/into工具来理解代码的执行方式 在对单个Python文件进行一些更改后,调试器开始出现异常行为当脚本本身按预期执行时(基于日志和预期的副作用),当我使用调试器逐步执行脚本时,它跳过明显正在执行的行,并在明显没有执行的行上停止。 例如,在设置一个早期断点并仅使用“单步执行”在脚本执行过程中导航后,调试器依次突出显示以下行: if语句(正常[期望根据变量值解析为true]) if

我正在从事一个Python项目,我经常使用VS Code Python调试器,使用断点,或者只是使用step over/into工具来理解代码的执行方式

在对单个Python文件进行一些更改后,调试器开始出现异常行为当脚本本身按预期执行时(基于日志和预期的副作用),当我使用调试器逐步执行脚本时,它跳过明显正在执行的行,并在明显没有执行的行上停止。

例如,在设置一个早期断点并仅使用“单步执行”在脚本执行过程中导航后,调试器依次突出显示以下行:

  • if语句(正常[期望根据变量值解析为true])
  • if块的每一行(正常)
  • 对应else块的第一行(不正常)——不停止else语句本身(也不正常)
  • try块的第二行,不在try语句本身上停止,也不在try块的第一行上停止(不正常)——也不在上述else块中的任何其他行上停止
  • 。。。(更多行)

  • if块的第二行,if语句对其解析为false,而不在if语句本身或if语句的第一行停止(非正常)
  • finally块的第二行,不停在与上述语句相对应的else语句或else块(不正常)——或者停在finally行本身,或者停在finally块的第一行(不正常)
  • 同样,我可以清楚地告诉你这不是代码的执行方式。参考上面的步骤5和6:代码生成一封电子邮件,如else案例中的编码,而不生成一封电子邮件,如if案例中的编码

    如果我将文件恢复到以前的状态,调试器将正常运行。使用git diff,我可以看出上一个版本和这个版本在阻塞、括号、空格等方面没有区别

    我错过什么了吗?我不相信我以前有过这个问题

  • 我不明白更改代码将如何更改调试器的行为
  • 这个问题使得调试器对于我理解代码行为的意图基本上是无用的

  • 我将尝试解释,假设您有以下代码:

    1 if True:
    2     if False:
    3         a = 1
    4 else:
    5     b = 2
    6 try:
    7     c = 3
    
    然后使用调试器运行Python,它将在第1行停止。 接下来,删除IDE中的第2行并获得实际代码:

    1 if True:
    2     a = 1
    3 else:
    4     b = 2
    5 try:
    6     c = 3
    
    许多框架在开发模式下使用看门狗在源文件更改时自动加载项目(也有一些调试器可以为特定更改的模块动态地这样做)。但如果您的编辑没有触发Python的重新加载,那么脚本就会按顺序执行行:

    • 1(如果为真)
    • 2(如果为假)
    • 4(其他)
    • 6(尝试)
    IDE将在这些行上停止,但语句错误:

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

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

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

    如果没有上述解决方法,我会偶尔遇到问题——我无法准确地确定问题发生的时间。我已经就此提出了问题。

    在代码更改后是否重新加载了Python进程?看起来调试器有另一个版本的运行时代码。我不确定你到底在问什么。但是,我已经保存了代码,重新启动了VS代码,并重新安装了VS代码的Python扩展。这有帮助吗?我很抱歉我不清楚。在发布这个问题之前,我采取了所有这些步骤——它们并没有改变任何东西。我的VScode Python调试器今天也开始表现出疯狂的行为。拒绝执行某些代码。有时拒绝正确使用F11。打开调试文件的副本,标题有时是斜体。有时打断别人的评论。等等。我有最新版本1.43.2。谢谢,这很有道理。我以前观察过这种行为,当时我编辑代码时没有保存文件。这一次,我只是没想到这会是给我带来麻烦的同一个基本问题——不仅保存了文件,还重新启动了IDE。对我来说,逻辑上是这样的:是否有某种方法可以确保Python/项目被重新加载?请检查@frost-nzcr4,除非我遗漏了一些东西OP在启动调试过程和出现问题之间没有更改任何代码。你的答案似乎不适用,可能会混淆。如果我确实错过了OPs帖子中您正在解释的相关部分,那么我将得到更正。我刚刚发现VSCode的ptvsd在PyDev.Debugger(也称pydevd 1.3.3)下使用,它太旧了,最近的版本是1.9.0。在以前的版本中,模块热重新加载中存在可能导致此行为的错误。