如何配置VS Code,以便在调试Python脚本时加载共享库(.so)并进入其中的代码?

5
从命令行使用gdb时,我可以在共享库加载时中断。如果我有共享库的源代码,我如何在VS Code中获得相同的行为?

这实际上是与Python相关还是只与C相关?如果你指的是Python的C扩展模块,那么在调试器中无法跨越Python/C界限(你需要使用Visual Studio)。 - Brett Cannon
我无法使用Visual Studio因为我正在Linux环境中工作。我的工作流程如下:我有一个使用特定python库的python脚本。我正在修改用C++编写的共享库的代码。这个共享库是被我从我的python脚本中调用的python库所加载的。我正在寻找一种方法来在我的共享库被加载时断点,以便能够在VS Code中进行图形化调试。 - Salah
3个回答

6

对我来说,它在某种程度上有效。

这是我的设置:

  • Ubuntu 18.04,调试我从Python3加载的C++共享库(更具体地说-通过Cython,但我记得当通过ctypes加载.so时也同样有效,当在类似设置中调试纯C lib时,我也记得它有效)
  • 在VSCode中,我有一个项目,可以编译成那个.so
  • 我在那里放了一堆断点
  • 我创建了一个启动配置(下面是文本)
  • 此外,我已经用调试信息编译了.so

这是我的launch.json(大部分是样板文件,我只填写了“program”和“args”部分,并设置了PYTHONPATH环境变量)。

注意:似乎重要的是要有“stopAtEntry:false”(默认情况下),否则VSCode会尝试定位一个入口.c文件或其他内容。

{
// 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": "(gdb) Launch 1123",
        "type": "cppdbg",
        "request": "launch",
        "program": "/home/sergey/anaconda3/bin/python",
        "args": [
            "/storage/projects/cython-vst-loader/cython_vst_loader/test_load_plugin.py"
        ],
        "stopAtEntry": false,
        "cwd": "${workspaceFolder}",
        "environment": [
            {
                "name": "PYTHONPATH",
                "value": "/storage/projects/cython-vst-loader"
            }
        ],
        "externalConsole": false,
        "MIMode": "gdb",
        "setupCommands": [
            {
                "description": "Enable pretty-printing for gdb",
                "text": "-enable-pretty-printing",
                "ignoreFailures": true
            }
        ]
    }
]

无论如何,在这个设置中,我看到我的VSCode在我的断点处停止执行。

enter image description here


运行正常,但只有在删除setupCommands块后才能正常工作。 “setupCommands”:[ { “description”:“启用gdb的漂亮打印”, “text”:“-enable-pretty-printing”, “ignoreFailures”:true } - MegaNightdude
此外,我根本不需要环境块。 - MegaNightdude
我有一个问题。如果我想要使用cuda-gdb来调试不仅是c++,还有cuda c++,有类似的方法吗? - Ziqi Fan

0

很遗憾,目前没有办法将Python代码转换为C代码以进行调试(据我所知,只有Visual Studio具备这种能力)。


另外,当共享库被加载时,是否有一种方法可以附加到它? - Salah
@salah 不太确定。 - Brett Cannon
尝试使用VScode扩展程序“Python C++ Debug”。 - thayne

0

谢谢 @user1312695,你的方法对我很有用!

现在我能够进入pybullet.c了!让我以此为例。 https://github.com/bulletphysics/bullet3

我想将可调试版本的pybullet包安装到conda环境中,并使用VScode开始调试,这是我所做的:

(0) 创建一个名为debug_pybullet的新conda环境。

(1) 修改cmake/FindPythonLibs.cmake

FindPythonLibs.cmake无法识别conda环境,因此在它找到错误的_PYTHON_EXECUTABLE后,我需要手动设置路径,大约在第143行左右:

set(_PYTHON_EXECUTABLE /home/MyName/anaconda3/envs/debug_pybullet/bin/python)

(2)修改CMakeLists.txt

我需要手动添加文件build_cmake_pybullet_double.sh中包含的定义,除了CMAKE_BUILD_TYPE=Release的定义(我更喜欢让VSCode控制这个定义)。

此外,我在第93行左右手动设置了PYTHON_SITE_PACKAGES

set(PYTHON_SITE_PACKAGES /home/MyName/anaconda3/envs/debug_pybullet/lib/python3.6/site-packages)

(3)在VScode中创建launch.json
这是我的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": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "/home/MyName/anaconda3/envs/debug_pybullet/bin/python",
            "args": [
                "/home/MyName/<path_to_python_file>/main.py"
            ],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
        }
    ]
}

由于我手动设置了路径,所以这里不需要environmentssetupCommands

(4) 在VScode中,构建全部。

(5) 安装可调试包:

$ source activate pybullet_debug
(pybullet_debug)$ pip install -e .

(6) 在pybullet.c中设置断点。

(7) 按下F5,运行Python,就可以了!

附有截图。


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