使用 VSCode 调试 PySide (Linux + Windows)#

VSCode 允许你在一个调试会话中使用多个调试器。这意味着我们可以在一个会话中同时使用 Python PDB 和 GDB(或 Windows 的 MSVC 调试器)。使用 VSCode,你可以做到以下事情:

  • 看到 Python 和 C++ 的调用栈。

  • 在 Python 和 C++ 代码中设置断点。

  • 从 Python 代码步进到 C++ 代码,反之亦然。

对于 Windows,请参阅 创建调试构建

让我们开始设置一切并调试一个 Python 进程。

设置 Python 解释器#

为了调试 Python 代码,需要在 VSCode 中设置正确的 Python 解释器 - 这将确保 VSCode 中所有 Python 集成使用相同的解释器。但这不会影响 C++ 调试,并且必须单独为相应的启动目标设置 Python 可执行文件路径(请参阅以下部分)。

要设置 Python 解释器,打开一个 Python 文件,然后在 VSCode 状态栏的右侧点击相应的选项,应该看起来像这样

set Python interpreter

或者,打开 VSCode 命令面板(F1 或 Ctrl + Shift + P)并搜索“Python: Select Interpreter”。

在 launch.json 中创建配置#

运行 -> 添加 配置 -> Python -> Python 文件

这将创建一个 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"
        }
    ]
}

它应该已经包含一个名为“Python: Current File”的配置,这允许我们调试当前打开的 Python 文件。

现在,我们需要添加一个配置来将 C++ 调试器附加到已经以调试模式运行的 Python 进程。如果您已安装 C/C++ 扩展并拥有适合您系统的调试器,VSCode 应该能够自动提供添加配置的建议。在 Linux 上,建议的名称为

  • “C/C++: (gdb) Attach”

在 Windows 上则是

  • “C/C++: (Windows) Attach”

在 Linux 上,您的 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"
        },
        {
            "name": "(gdb) Attach",
            "type": "cppdbg",
            "request": "attach",
            "program": "/path/to/python",
            "processId": "${command:pickProcess}",
            "MIMode": "gdb", "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

在 Windows 上则是这样

{
    // 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"
        },
        {
            "name": "(Windows) Attach",
            "type": "cppvsdbg",
            "request": "attach",
            "processId": "${command:pickProcess}",
        }
    ]
}

对于 Linux,还请确保“program”的值指的是您虚拟环境中的 Python 解释器(在 Windows 上不需要这样做)。我们需要进程 ID 才能附加 gdb 调试器到进程。通过“${command:pickProcess}”,我们可以实时找到进程 ID,正如我们将看到的。

现在,我们准备开始调试。

调试进程#

  1. 在 Python 代码中设置断点。

  2. 转到 运行 调试(Ctrl + Shift + D)并点击运行符号(绿色右箭头)来运行“Python: Current File”。这将触发断点并使 Python 调试器暂停。

  3. 使用下拉菜单将“Python: Current File”更改为“(gdb)Attach”或“(Windows)Attach”。您的设置现在应该如下所示。

    breakpoint before attach gdb
  4. 运行“(gdb)Attach”或“(Windows)Attach”,这将询问您要附加 C++ 调试器的 Python 进程的进程 ID。VSCode 还允许您通过名称搜索进程。

    技巧

    您可以通过运行 ps aux | grep python 来找到进程 ID

    find process vscode
  5. VSCode 可能现在会要求您输入超级用户权限。如果是这种情况,请输入“y”并输入您的密码。

    Superuser access is required to attach to a process. Attaching as
    superuser can potentially harm your computer. Do you want to continue?
    [y/N]_
    
  6. 就是这样。您现在应该能够命中您在 C++ 对应版本上设置的断点。

    Breakpoint set on the shiboken wrapper class

    在 shiboken 包装类上设置断点

    Breakpoint set on C++ implementation

    在 C++ 实现上设置断点