在VS-Code中,调试器无法在断点处停止。

70
我刚刚安装了VS Code和Python扩展,但是我无法让调试器正常工作。每次我尝试使用调试器时,它都会跳过我设置的任何断点,并像正常运行程序一样执行。
我在Windows 10 PC上使用VS Code,安装了Python 3.7.3和Python扩展。我按照这里的说明(https://code.visualstudio.com/docs/python/python-tutorial)在C:\python_work\hello中创建了一个名为'hello'的测试文件夹,并在该文件夹中创建了一个名为'hello.py'的程序。下面是hello.py的代码。我尝试通过点击绿色箭头和按下F5来使用调试器,但似乎都无法使调试器正常工作。我的'launch.json'文件也在下面显示。

hello.py:

msg = "Hello World!"
print(msg) # Breakpoint

launch.json:

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            "stopOnEntry": true
        },
    ]
}

我本来期望底部的状态栏变成橙色,并且程序在第二行停下来,让我可以在预览窗格中检查局部和全局变量。然而,底部的状态栏只保持橙色了半秒钟,程序继续运行,就好像我按下了“在终端中运行Python文件”,而没有在断点处停下来。请帮忙!

对我来说它运行得很好。发送到终端以启动调试器的内容是什么? - Brett Cannon
类似这样:cd c:\python_work\hello && cmd /C "set "PYTHONIOENCODING=UTF-8" && set "PYTHONUNBUFFERED=1" && C:\Python\python.exe c:\Users\RohanPC\.vscode\extensions\ms-python.python-2019.6.22090\pythonFiles\ptvsd_launcher.py --default --client --host localhost --port 49389 c:\python_work\hello\hello.py " - rogo8888
如果您能在 https://github.com/microsoft/vscode-python 提交一个 bug 并提供一个可以重现问题的文件夹的 GitHub 项目或 zip 文件,那么我们可以看一下并尝试找出问题所在。 - Brett Cannon
2
我刚刚重新安装了Windows,问题得到了解决!非常感谢您的帮助。 - rogo8888
85
一般来说,重新安装 Windows 至少每天两次被认为是良好的做法。 - kmiklas
在MacOS上,“运行->开始调试(F5)”有时不会停在断点处。假设Python模块作为脚本运行(即,它包含一个条件if __name__ == "__main__":),并且在执行期间遇到Python异常,则VS Code会在主要部分中弹出消息框“Exception has occurred: System Exit”。此时,单击“运行->重新启动调试(shift-cmd-F5)”,然后就可以命中断点了。 - caucus
13个回答

88

"justMyCode": false设置为假,可以使其在断点处停止:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Debug Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            "stopOnEntry": true,
            "justMyCode": false
        },
    ]
}

53
这有效了... 我怎么可能猜得到这样的事情呢? - Vland
2
默认值不是“true”真的很奇怪!我现在面临的另一个问题是,在执行最后一行后,它不会结束调试。它会进入“runpy.py”... 我该如何解决这个问题? - S.B
4
如果没有类似StackOverflow这样的资源,我不认为我能解决这个问题。Just My Code是一组功能,通过隐藏一些你可能正在使用的优化库(比如.NET Framework本身)的细节,使得调试代码更容易,详情请参见https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md#just-my-code。但是我正在运行一个包含几行简单代码且没有调用任何模块的程序。有人可以解释一下为什么我需要关闭这个功能吗? - Andy Brown
5
我该如何找到这个文件以进行编辑? - Luke Schoen
1
在菜单栏上,点击“运行”,然后点击“打开配置”。 - Ashish
显示剩余5条评论

46

如果您正在使用pytest-cov模块,您可能还想看一下pytest配置设置 注意:

注意如果您安装了pytest-cov覆盖率模块,则VS Code在调试时不会在断点处停止,因为pytest-cov正在使用相同的技术来访问正在运行的源代码。为了防止这种行为,在调试测试时,在pytestArgs中包含--no-cov,例如通过将"env": {"PYTEST_ADDOPTS": "--no-cov"}添加到您的调试配置中。

请参见下面的示例配置文件(launch.json):

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Debug Tests",
            "type": "python",
            "request": "test",
            "console": "integratedTerminal",
            "justMyCode": false,
            "env": {"PYTEST_ADDOPTS": "--no-cov"}
        }
    ]
}

6
这恰好也是我面临的问题。 我在我的.vscode/settings.json文件中有以下内容:{ "python.testing.pytestArgs": [ "--cov=src", "--cov-report", "html", "tests" ] // 删除与覆盖率相关的行就解决了这个问题。 - Michael S
2
在我的情况下,覆盖率是在我的 setup.cfg 文件中设置的。通过从该文件中删除它或使用Tomasz的 "env" 提示来解决问题。谢谢! - BraisLP
1
VSCode用警告突出显示了行'request': 'test':请求类型的配置。可以是“launch”或“attach”。 值不被接受。有效值:“launch”。但它仍然可以工作。 - Alex
这是最近更改的内容:https://code.visualstudio.com/docs/python/testing#_debug-tests。需要添加 "purpose": ["debug-test"]。https://code.visualstudio.com/docs/python/debugging#_purpose - rdbisme

4

我遇到了同样的问题,并通过以下方式安装Python虚拟环境来解决它:

[MyProjectFolder] \ venv

通过输入命令

python -m venv [MyProjectFolder]\venv

在控制台中。

看起来VS Code正是期望这样的文件夹结构。

在我将venv文件夹结构直接安装在我的项目文件夹中之前,即

[MyProjectFolder] \ Scripts
[MyProjectFolder] \ Lib
[MyProjectFolder] \ Include
[MyProjectFolder] \ pyvenv.cfg

该功能未能正常工作,并且导致了与描述的调试问题完全相同的问题。

仅供参考:VS Code版本为1.52.1,Python版本为3.8.5。


这将创建一个 .venv 但不允许我选择 venv 解释器。 - AlxVallejo
我认为这与调试点问题无关。你可以通过执行 CTRL+Shift+P -> 选择Python解释器 -> 输入解释器路径 来选择Python解释器。 - alelom
感谢您的回答,运行 python -m venv 命令之前应该删除 scripts lib include 和 pyenv.cfg,安装新的 venv 格式,然后重新启动 vscode。 - Guillermo Ruffino
那对我起了作用! - sonntam

2
从Python 3.9降级到3.8对我有用。
在Windows 10版本20H2上运行Python 3.9 64位时,VC Code 1.56.2忽略了断点。安装Python 3.8.10 64位后,问题得到解决。我只需要在VS code中选择Python 3.8.10解释器,它现在可以识别断点。不需要更改配置文件,例如,我不需要 "justMyCode": false。
我意识到这是一个老问题,但我的谷歌搜索引导我来到这里。以便为那些在2021年尝试使用3.9的人发布此修复。

1
我使用的是Python 3.8.2版本,但调试点从未对我起作用过。 - alelom
我还尝试了进一步降级:我从Python 3.8.2 x64降到了Python 3.7.8 x32,但调试点仍然无法正常工作。 - alelom
还尝试将版本从3.9降级到3.8,但仍然无法工作。如果有人找到了解决方法,请分享! - Alexander

1

另一个导致断点无法正常工作的原因是elevate

try: # https://pypi.org/project/elevate/
    from elevate import elevate
except ModuleNotFoundError: # install it if not found
    subprocess.call([sys.executable, "-m", "pip", "install", 'elevate'])
finally:
    from elevate import elevate

# require elevated permissions right away...
elevate()

elevate()命令将程序作为新的(子)进程重新启动,因此整个文件都无法设置断点。以下是作者的原话:

在Windows上,新进程的标准流未附加到父进程,这是UAC的固有限制。

在Windows中,要调试需要以管理员身份运行的Python应用程序,可以使用以下解决方法:

  1. 关闭VS Code。
  2. 右键单击VS Code图标,选择“以管理员身份运行”。

Linux用户可能可以使用sudo code进行相同操作。现在该进程最初将作为管理员生成,因此对elevate()的调用不起作用,整个文件都可以进行调试。


1
我的问题在于我将断点放在函数声明的那一行上,也就是 def foo(x): 这行,而不是把断点放在函数内第一个非注释行上。
如果您的函数的第一行是注释,则调试器将假定您希望在函数声明行上放置断点并将其移回,因此确保您不要将断点放在注释上!

1
我曾经遇到过相同的问题,由于从Python 3.7升级到3.9版本。后来我发现旧版本是32位的,而我升级到的新版本是64位的,这显然导致了问题。卸载64位版本并安装32位版本的Python 3.9解决了我的问题,然后我就能再次使用Visual Studio Code的断点功能了。

这对我没有用。我从Python 3.8.2 x64转到Python 3.7.8 x32,但调试点仍然无法正常工作。 - alelom

1

对于所有寻找与Python单元测试中断点相关的解决方案的人:

  1. 如果尚未添加配置文件(例如launch.json),请按照VSCode Python调试教程中的说明进行添加。

  2. 以下配置设置对我有用,其中设置cwd(由于srctest文件夹)和purpose(参见这里)是必不可少的。


"version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Test Cases",
            "type": "python",
            "request": "launch",
            "cwd": "${workspaceFolder}/afinad/src",
            "purpose": [
                "debug-test"
            ],
            "console": "integratedTerminal",
        }
    ]

愉快的调试!


1
这是 launch.json,不是 lunch.json 哈哈 - Jeff Wright
@JeffWright:某种意义上也可能是后者;),不过,感谢您指出这一点,现在已经更正了。 - marcel h

0
这件事发生在我走过这个VSCode教程的时候。
我的调试器不工作,因为我不小心把文件放在了.venv文件夹里。当我把它移出去后,它就正常运行了。

0

调试器不停在断点处的另一个来源:在VS Code中打开了来自另一个目录的同名文件。

实际上,VS Code可以在任何Python文件上设置断点,即使在Python项目目录之外;如果文件的路径与launch.json中的"program": [your-file-name-here]条目不匹配,则不会触发断点。

例如:Python源文件的副本位于dist/lib下,这是setuptools的输出(运行:python setup.py bdist_wheel生成它们)。

如果没有通过.gitignore排除dist/lib,则其内容将显示在搜索结果侧边栏中,并可能因误操作而被打开。

注意:如果launch.json配置具有"program": "${file}",则上述内容不适用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接