联合调试python/C++

联合调试python/C++

我想实现在vscode里调试python代码,遇到extern的C++代码,也能跳进C++函数里。

或者说python调试过程中,想跳入C++代码,要如何实现呢?

生成支持debug的链接库

首先python代码中 import 的库,需要能够支持debug,不支持debug的库(.so)无法调试。

于是要在make的时候加入信息,让它make出来的链接库要可以debug。

有两种方法:

  1. **用cmake**,来把cpp编译成python可以import的库 的时候,加入debug选项。(cmakelists.txt里是pybind11_add_module

CMakeLists.txt中加入:

1
2
3
4
SET(CMAKE_BUILD_TYPE "Debug") 

SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

重新编译:在build里:

1
2
3
4
# cmake clean ..
cmake -DCMAKE_BUILD_TYPE=Debug ..
cmake -DCMAKE_BUILD_TYPE=Debug --build .
make

生成支持debug的动态链接库.so。(路径在build/下)

(cmake方法参考的 模型部署入门教程(四)阅读笔记一之Pybind11 保姆级教程 ,并在上面做了修改)

  1. **用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++代码的调试方法。

调试方法有两种:

  1. 命令行 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

  1. 用VSCode调试,通过VSCode的attach功能调试

具体做法为:修改 launch.json

选添加配置:

image-20230215180432615

选(gdb)附加:

image-20230215180522052

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

image-20230215180708634

最终的 launch.json长这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) 附加",
"type": "cppdbg",
"request": "attach",
"program": "/mnt/k/anaconda3/bin/python",
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
]
},
{
"name": "Python: 当前文件",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"justMyCode": false
}
]
}

然后 ctrl+p 输入 >developer:reload window 回车。

在python文件打端点,在cpp文件里打断点。开始调试python文件,当执行到断点处时,选择(gdb)附加 (原本是python:当前文件),然后点绿色箭头),

image-20230215180923473

弹出 附加到进程 ,输入python文件名,选择下面那个。

image-20230215182152138

或者在命令行里敲 ps aux |grep python,查看进程号,敲进去。

image-20230215182453382

连接上之后(红色插头),敲F5继续,就可以看见跳进C++代码了。

image-20230215182635255

(vscode调试参考的 【C++编程系列】如何利用vscode调试pytorch源码(python/c++)

chatgpt回答

chatgpt

在Python和C++联合调试时,您可以使用以下方法:

  1. 使用共享库:将C++代码编译为共享库,然后在Python中使用ctypes模块加载库。这样,您可以使用Python代码来调用C++代码,并在C++代码中使用gdb或其他调试器进行调试。(分开调试)
  2. 使用调试器:在C++代码中设置断点,并在Python代码中使用subprocess模块运行C++程序。这将在C++代码中触发断点,允许您检查C++代码中的变量和执行路径。
  3. 使用调试服务器:在C++代码中添加调试服务器,并在Python代码中使用Python的内置pdb模块连接到该服务器。这将使您能够在C++代码中调试,并使用Python代码来查看和修改C++变量。

无论您选择哪种方法,都需要确保您的Python和C++代码之间的接口正确地定义了数据结构,以便在两个语言之间传递数据。

要在VS Code中调试Python代码并跳进C++代码,您可以使用以下步骤:

  1. 确保您的C++代码被编译为共享库,以便Python可以加载它。如果您的C++代码没有编译为共享库,请按照操作系统和编译器的指示进行操作。

  2. 在VS Code中打开Python文件,并按照常规方式启动调试器。这将启动Python调试器,并暂停在您的Python代码中的第一行。

  3. 在VS Code中的调试控制台中输入以下命令,以确保您的共享库路径已被添加到Python的sys.path中:

    1
    2
    import sys
    sys.path.append('/path/to/your/shared/library')

    这将允许Python找到并加载您的C++共享库。

  4. 在您的Python代码中使用ctypes模块加载C++共享库,如下所示:

    1
    2
    import ctypes
    mylib = ctypes.CDLL('/path/to/your/shared/library/mylib.so')

    这将加载名为mylib.so的共享库,并使其可用于Python。

  5. 在您的Python代码中调用C++代码,并使用VS Code的调试功能中的“跳过”或“跳进”命令进入C++代码。如果您在C++代码中设置了断点,VS Code调试器将暂停在该断点处,允许您检查C++代码的变量和执行路径。

请注意,为了使C++和Python代码之间的接口正确地定义数据结构和函数签名,您需要仔细编写并编译您的C++代码,并使用正确的ctypes函数调用C++函数。这可能需要一些实践和调试,以确保正确的交互。

待看

visual studio 官方教程:一起调试 Python 和 C++

调试Python调用的C++共享库

python gdb

https://www.bilibili.com/video/BV1wV4y1p7Ak/?spm_id_from=333.337.search-card.all.click&vd_source=5e9891722f2b62adca440a5e92121b5b

https://www.bilibili.com/video/BV1kP4y1K7Eo/?spm_id_from=333.337.search-card.all.click&vd_source=5e9891722f2b62adca440a5e92121b5b

  • subprocess