1. 编译 Debug 版本
# 在项目根目录下创建构建目录(若尚未创建)
mkdir -p build && cd build
# 配置 Debug 构建
cmake -DCMAKE_BUILD_TYPE=Debug ..
# 编译(根据 CPU 核心数调整 -j 参数)
make -j$(nproc)
2. 获取 Python 进程 PID
在 Python 脚本的 最开头 添加以下代码,用于打印 PID 并暂停等待输入(方便后续附加 GDB):
import os
print("pid:", os.getpid())
input("Press Enter to continue...") # 阻塞,直到在终端敲回车
3. 启动 GDB 附加进程
3.1 允许非 Root 用户调试
在 Ubuntu 中默认限制普通用户调试其他进程,需临时解除限制:
echo "0" | sudo tee /proc/sys/kernel/yama/ptrace_scope
注意:此操作需 sudo 权限,且重启后失效。若需永久生效:
sudo sysctl -w kernel.yama.ptrace_scope=0
3.2 附加到目标进程
# 替换 <PID> 为 Python 脚本打印的 PID
gdb attach <PID>
4. 设置断点并调试
4.1 在 GDB 中设置断点
# 对特定文件的某一行下断点(例如 xxx.cc 的第 123 行)
(gdb) b xxx.cc:123
# 或对函数名下断点
(gdb) b MyClass::MyFunction
4.2 继续执行程序
(gdb) c
4.3 触发断点
回到 Python 脚本所在终端,按 Enter
继续执行,程序会在断点处暂停。
5. 常用 GDB 调试命令
命令 | 作用 |
---|---|
bt | 查看调用栈(backtrace) |
p variable | 打印变量值 |
n | 单步执行(不进入函数) |
s | 单步执行(进入函数) |
info threads | 查看所有线程 |
thread <ID> | 切换到指定线程 |
q | 退出 GDB |
注意事项
- 代码一致性:确保 GDB 调试的二进制文件与 Python 调用的完全一致(重新编译后需重启 Python 脚本)。
- 动态库断点:若断点位于动态库中,需确保库的 Debug 符号已加载(编译时带
-g
)。 - 多线程调试:使用
info threads
和thread <ID>
管理多线程问题。 - GDB 增强工具:可安装 gdb-peda 或 pwndbg 提升调试效率。
通过以上步骤,你可以高效地调试python端调用C++ 代码部分。如需更复杂的操作(如条件断点、观察点),可进一步查阅 GDB 官方文档。