TVM中Python如何和C++联调?

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

注意事项

  1. 代码一致性:确保 GDB 调试的二进制文件与 Python 调用的完全一致(重新编译后需重启 Python 脚本)。
  2. 动态库断点:若断点位于动态库中,需确保库的 Debug 符号已加载(编译时带 -g)。
  3. 多线程调试:使用 info threadsthread <ID> 管理多线程问题。
  4. GDB 增强工具:可安装 gdb-pedapwndbg 提升调试效率。

  通过以上步骤,你可以高效地调试python端调用C++ 代码部分。如需更复杂的操作(如条件断点、观察点),可进一步查阅 GDB 官方文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值