Python & C/C++ 混合开发,调试指南

Debug 第三方库:

调试Python第三方库时,通常需要从源码编译库的 Debug 版本,过程可能会非常繁琐,特别是涉及 C/C++ 依赖时。

但也可以用python调试release库,但生成调试信息pdb,这样可以调试源码而不用python_d

常见问题:
  1. 依赖 C++ 库

    • 如果某些三方库依赖大量 C++ 代码 SDK,这可能涉及几个 GB 的开发库,并且需要复杂的编译环境配置。
    • 在面对第三方 Python 库中使用大量 C++ 代码时,建议考虑是否值得继续,尤其是调试时间成本较高的情况下。
  2. 不兼容的 ABI

    • python_d只能加载 Debug 动态链接库, 因此需要从源码重新编译。
    • 需要自行尝试,如果 python_d 运行出现找不到模块的错误通常就是ABI不兼容需要自行编译debug版本
    • 就算你把release库重命名为_d结尾,_d版本python也不能加载,会出现错误(版本不兼容导入失败):
    • <Fault 1: “<class ‘ImportError’>:Module use of python312.dll conflicts with this version of Python.”>
  3. 自定义构建工具

    • 如果库使用 makecmake 等自定义构建工具,而非使用 setuptools,则需要手动编译和安装,按照库的 README, docs 文档进行编译步骤。
适用于使用 setuptools 的库:

对于仅使用 setuptools 构建的库,可以直接使用以下命令安装 Debug 版本:

1
2
3
4
# 从 requirements.txt安装所有库的 debug 版本
pip install --no-binary :all: --global-option build --debug -r requirements.txt
# 安装指定的库 debug 版本
pip install --no-binary :all: --global-option build --debug <package-name>

在 VSCode 中混合调试 Python 和 C++ 源码

要在 VSCode 中同时调试 Python 和 C++ 代码,需要以下配置:

必要插件:
  1. C++ 插件:支持 C++ 代码的调试。
  2. Python 插件:支持 Python 代码的调试。
  3. GDB: 调试C\C++代码
  4. Python C++ Debugger 插件(可选):此插件可以自动附加调试进程,或自行使用 GDB 进行手动附加调试。
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
{
"version": "0.2.0",
"configurations": [
{
"name": "Python C++ Debug",
"type": "pythoncpp",
"request": "launch",
"pythonLaunchName": "Python:Streamlit",
"cppAttachName": "(Windows) Attach"
},
{
"name": "(Windows) Attach",
"type": "cppvsdbg",
"request": "attach",
"processId": "",
"sourceFileMap": {
// 映射 Python 源码, 不是必须
"d:/a/1/s/": "D:/Users/Li_Dong/PythonProject/Python-3.12.6"
}
},
{
"name": "Python:Streamlit",
"type": "debugpy",
"request": "launch",
"python": "${workspaceFolder}/env/Scripts/python_d.exe",
"module": "streamlit",
"justMyCode": false,
"args": ["run", "Chenyme-AAVT.py", "--server.port", "8501"]
}
]
}
注意事项:
  • 使用 _d 版本 Python:确保你安装并使用了 Python 的 Debug 版本(python_d)。
  • **关闭 justMyCode**:关闭此选项以便调试第三方库代码,而不仅仅是你自己的代码。

c_cpp_properties.json 示例配置:

这个文件主要用于 C++ 代码的语法分析,方便代码提示和调试。

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
{
"configurations": [
{
"name": "Win32",
"includePath": [
// Python 源码头文件目录, 不是必须
"D:/Program Files/Python312/include",
"${workspaceFolder}/CTranslate2/third_party",
"${workspaceFolder}/CTranslate2/include",
"${workspaceFolder}/env/Lib/site-packages/torch/include"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"windowsSdkVersion": "10.0.26100.0",
"compilerPath": "cl.exe",
"cStandard": "c17",
"cppStandard": "c++17",
"intelliSenseMode": "windows-msvc-x64"
}
],
"version": 4
}
总结:
  • 手动编译第三方库的 Debug 版本可能会耗时,尤其是有复杂依赖时。
  • 对于使用 setuptools 的库,可以通过 pip install --no-binary 安装 Debug 版本。
  • 在 VSCode 中配置好 Python 和 C++ 的调试环境,可以帮助你同时调试 Python 与 C++ 代码。

参考:

https://nadiah.org/2020/03/01/example-debug-mixed-python-c-in-visual-studio-code/

You need to set install_url to use ShareThis. Please set it in _config.yml.