联合调试python/C++
我想实现在vscode里调试python代码,遇到extern的C++代码,也能跳进C++函数里。
或者说python调试过程中,想跳入C++代码,要如何实现呢?
生成支持debug的链接库
首先python代码中 import 的库,需要能够支持debug,不支持debug的库(.so)无法调试。
于是要在make的时候加入信息,让它make出来的链接库要可以debug。
有两种方法:
- **用
cmake
**,来把cpp编译成python可以import的库 的时候,加入debug选项。(cmakelists.txt里是pybind11_add_module
)
CMakeLists.txt中加入:
1 | SET(CMAKE_BUILD_TYPE "Debug") |
重新编译:在build里:
1 | cmake clean .. |
生成支持debug的动态链接库.so。(路径在build/下)
(cmake方法参考的 模型部署入门教程(四)阅读笔记一之Pybind11 保姆级教程 ,并在上面做了修改)
- **用
python setup.py
**,来把cpp编译成python可以import的库 的时候,加入debug选项
命令行执行:python3 setup.py build_ext --debug install
(setup方法参考的 VSCode 联合调试Python/C++ ,并在上面做了修改,以及 How to pass –debug to build_ext when invoking setup.py install? )
联合调试
这里介绍的是 python代码里用到C++代码的情况,也就是调试python代码时 跳入C++代码的调试方法。
调试方法有两种:
- 命令行 gdb/cgdb调试 ,直接通过命令行的
gdb --args python XX.py
进行调试,在cpp代码里打断点,比如b myadd.cpp:7
,然后r
执行,就会跳转到cpp文件的断点位置。
这里更标准的写法是:
先打cpp代码的断点,然后gdb -ex r --args python script.py args
(args是传入python的参数);
如果想同时查看python脚本,则用混合模式 gdb -ex r --args python -m pdb script.py
。
(gdb调试参考的 VSCode 联合调试Python/C++ 、How to debug python script in C level using GDB. Give me a simple example for this)
- 用VSCode调试,通过VSCode的attach功能调试
具体做法为:修改 launch.json
选添加配置:

选(gdb)附加:

在命令行敲 which python
得到 比如 /mnt/k/anaconda3/bin/python
, 然后把这一行写在配置的 program
里:

最终的 launch.json
长这样:
1 | { |
然后 ctrl+p
输入 >developer:reload window
回车。
在python文件打端点,在cpp文件里打断点。开始调试python文件,当执行到断点处时,选择(gdb)附加
(原本是python:当前文件
),然后点绿色箭头),
弹出 附加到进程 ,输入python文件名,选择下面那个。

或者在命令行里敲 ps aux |grep python
,查看进程号,敲进去。
连接上之后(红色插头),敲F5继续,就可以看见跳进C++代码了。

(vscode调试参考的 【C++编程系列】如何利用vscode调试pytorch源码(python/c++) )
chatgpt回答
chatgpt
在Python和C++联合调试时,您可以使用以下方法:
- 使用共享库:将C++代码编译为共享库,然后在Python中使用ctypes模块加载库。这样,您可以使用Python代码来调用C++代码,并在C++代码中使用gdb或其他调试器进行调试。(分开调试)
- 使用调试器:在C++代码中设置断点,并在Python代码中使用subprocess模块运行C++程序。这将在C++代码中触发断点,允许您检查C++代码中的变量和执行路径。
- 使用调试服务器:在C++代码中添加调试服务器,并在Python代码中使用Python的内置pdb模块连接到该服务器。这将使您能够在C++代码中调试,并使用Python代码来查看和修改C++变量。
无论您选择哪种方法,都需要确保您的Python和C++代码之间的接口正确地定义了数据结构,以便在两个语言之间传递数据。
要在VS Code中调试Python代码并跳进C++代码,您可以使用以下步骤:
确保您的C++代码被编译为共享库,以便Python可以加载它。如果您的C++代码没有编译为共享库,请按照操作系统和编译器的指示进行操作。
在VS Code中打开Python文件,并按照常规方式启动调试器。这将启动Python调试器,并暂停在您的Python代码中的第一行。
在VS Code中的调试控制台中输入以下命令,以确保您的共享库路径已被添加到Python的sys.path中:
1
2import sys
sys.path.append('/path/to/your/shared/library')这将允许Python找到并加载您的C++共享库。
在您的Python代码中使用ctypes模块加载C++共享库,如下所示:
1
2import ctypes
mylib = ctypes.CDLL('/path/to/your/shared/library/mylib.so')这将加载名为mylib.so的共享库,并使其可用于Python。
在您的Python代码中调用C++代码,并使用VS Code的调试功能中的“跳过”或“跳进”命令进入C++代码。如果您在C++代码中设置了断点,VS Code调试器将暂停在该断点处,允许您检查C++代码的变量和执行路径。
请注意,为了使C++和Python代码之间的接口正确地定义数据结构和函数签名,您需要仔细编写并编译您的C++代码,并使用正确的ctypes函数调用C++函数。这可能需要一些实践和调试,以确保正确的交互。
待看
visual studio 官方教程:一起调试 Python 和 C++
- subprocess