Raku NativeCall调用Rust FFI时CArray过长触发段错误求助
Dan::Polars模块CArray传参段错误问题
问题背景
- 开发中的Raku模块
Dan::Polars首轮压力测试、基准测试阶段,出现CArray传参触发段错误问题,已提供最小可复现样例。
运行环境
- 操作系统:Ubuntu
- Raku版本:Rakudo™ v2022.04,实现Raku® Programming Language v6.d标准
- 底层虚拟机:MoarVM 2022.04
- 复现环境:可使用
p6steve/raku-dan:polars-2022.02镜像(支持arm64/amd64架构)复现,首次运行需执行cargo build完成Rust动态库编译。
复现代码结构
Rust侧实现
- 代码编译产出动态库
libmre.so - 定义存储
String类型的VecC结构体,实现初始化、打印方法 - 通过
extern "C"导出两个C兼容接口:ve_new_str:入参为C风格字符串数组指针、数组长度,返回堆分配的VecC结构体指针ve_show:入参为VecC结构体指针,打印内部存储的向量内容
- 配套提供对应
Cargo.toml编译配置
Raku侧实现
- 通过
NativeCall加载编译生成的动态库 - 封装
VecC类 - 编写
carray函数生成CArray[Str]类型数组,传入Rust侧暴露的接口 - 已尝试将CArray变量声明提升至外层作用域,避免对象被GC提前回收,该方案未解决问题
故障现象
- 传入数组长度 N < 30 时,程序可正常运行并输出数组内容
- 传入数组长度 N > 50 时,程序直接抛出
Segmentation fault (core dumped)段错误 - 故障触发的长度阈值落在N=30到N=100区间
诉求
- 定位段错误根因,给出可落地的解决方案
- 方案需支持后续基准测试 N=2e9 规模的参数传递需求
内容的提问来源于stack exchange,提问作者librasteve
相关产品推荐
相关产品推荐

