用 C++ 扩展承接 Python 侧采集到的设备数据,在扩展内部完成迭代式后处理,再用 libtorch 组装成torch.Tensor交回 Python,是典型的高性能数据管线。这类代码常在 C++ 单测里完全正常,一旦跨过 C++ 到 Python 的边界就出现随机段错误,而且是否与张量形状有关,排查起来相当费时。
问题现象
典型表现是:Python 侧能顺利拿到返回的张量,shape、dtype都能正常读取,但只要触及底层数据——索引取值、print(tensor)、转成 numpy——进程直接崩溃,且不抛任何 Python 异常:
Segmentation fault (core dumped)更令人困惑的是崩溃与形状强相关。例如在 batch=5、data_len=28、data_wid=28 固定时,num_neurons取 1~5 或 18~35 正常,取 6~17 或大于 36 就崩。这种"只有某些尺寸才崩"的现象几乎可以断定为悬垂指针访问:不同尺寸触发分配器走不同的内存路径,某些情况下释放后的页面尚可读,于是"碰巧"成功。
出问题的 C++ 侧大致如下:
// processing.cpp