You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 20:15:06