【问题标题】:VSCode Python Debugger steps on lines not being executed--and over lines being executedVSCode Python 调试器在未执行的行上执行 - 并在正在执行的行上执行
【发布时间】:2020-07-13 11:38:14
【问题描述】:

我正在处理一个 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情况下编码的email,而不生成if情况下编码的email。

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

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

  1. 我不明白更改代码会如何改变调试器的行为
  2. 此问题使调试器对我理解代码行为的意图基本上无用。

【问题讨论】:

  • 您是否在代码更改后重新加载了 Python 进程?看起来调试器有另一个版本的运行时代码。
  • 我不确定你到底在问什么。但是,我已经保存了代码,重新启动了 VS Code,并重新安装了 VS Code 的 Python 扩展。
  • 这有帮助吗?
  • 抱歉,我不清楚。我在发布这个问题之前采取了所有这些步骤——它们没有改变任何东西。
  • 我的 VScode Python 调试器今天也开始发疯了。拒绝执行某些代码。有时会正确拒绝 F11。打开调试文件的副本,标题有时是斜体。有时会中断评论。等等等等。我有最新的 V 1.43.2。

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


【解决方案1】:

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

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

如果没有上述解决方法,我偶尔会出现问题——我无法准确确定它何时发生。我已经为此创建了问题https://github.com/microsoft/vscode-python/issues/11716

【讨论】:

    【解决方案2】:

    我会试着解释一下,假设你有代码:

    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(如果为真)
    • 2(如果为假)
    • 4(其他)
    • 6(尝试)

    IDE 将停止在这些行但有错误的语句:

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

    【讨论】:

    • 谢谢,这很有道理。我之前已经观察到这种行为,当时我在没有保存文件的情况下编辑了代码。这一次,我只是没想到这可能是给我带来麻烦的同样的基本问题——不仅保存了我的文件,而且还重新启动了我的 IDE。对我来说,合乎逻辑的是:有什么方法可以确保 Python / 项目被重新加载?
    • @frost-nzcr4 除非我错过了什么,否则 OP 在启动调试过程和发生问题之间没有更改任何代码。您的答案似乎并不适用,并且可能/将会混淆。如果我确实错过了您正在解释的 OP 帖子中的相关部分,那么我将得到纠正。
    • 我刚刚发现 VSCode 的 ptvsd 在底层使用 PyDev.Debugger 又名 pydevd 1.3.3,它太旧了,最近的版本是 1.9.0。在以前的版本中,模块热重载中存在可能导致此行为的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    相关资源
    最近更新 更多