如何用gdb调试pybind11封装的Python模块底层C++代码?
用GDB调试pybind11 Python模块的C++代码
完全可行,问题出在你默认安装的模块是Release模式编译的,没有调试符号,而且断点设置方式不对。按以下步骤操作即可解决:
1. 重新编译带调试信息的模块
默认安装的cmake_example是Release版本,缺少调试符号,导致GDB找不到对应的C++代码和函数地址。必须重新编译:
- 激活你的Python虚拟环境,进入cmake_example仓库根目录
- 清理旧构建文件:
rm -rf build - 创建构建目录并进入:
mkdir build && cd build - 用CMake指定Debug模式编译:
cmake -DCMAKE_BUILD_TYPE=Debug .. - 编译并安装到虚拟环境:
make && make install
2. 用GDB正确设置断点调试
模块是Python运行时动态加载的,直接启动GDB就打断点可能找不到目标,按以下两种方法操作:
- 方法一:指定源文件行号设待加载断点
找到你本地cmake_example.cpp的绝对路径(比如/home/user/cmake_example/cmake_example.cpp),假设add函数在第10行,在GDB中输入:break /home/user/cmake_example/cmake_example.cpp:10
GDB会提示“Function "add" not defined. Make breakpoint pending on future shared library load? (y or [n])”,输入y确认即可。 - 方法二:按 mangled 函数名设置断点
先在build目录下执行nm -D libcmake_example.so | grep add,会输出类似_ZN12cmake_example3addEii的 mangled 函数名,然后在GDB中输入:break _ZN12cmake_example3addEii
设置完断点后,在GDB中运行脚本:run main.py,当Python调用cmake_example.add(3,5)时,GDB就会触发断点,此时可以用next、step等命令调试C++代码。
额外验证步骤
可以先检查模块是否带调试符号:在GDB里输入file build/libcmake_example.so,如果输出包含“with debug_info”,说明编译正确。
内容的提问来源于stack exchange,提问作者User1305
相关产品推荐
相关产品推荐

