【发布时间】:2016-07-29 02:21:28
【问题描述】:
我正在尝试在 Rust 中进行一些动态库加载。从动态加载的库函数传递大的Vec 时出现分段错误。这是一个创建指定大小的Vec<i32> 的基本函数。如果Vec 比 8MB 大得多,程序会在 OSX 上遇到段错误。我在linux上运行时没有遇到同样的问题,有人可以看看这个并告诉我我是否在这里做错了什么?我正在运行它:
$ cargo build --release
$ ./target/release/linkfoo
8281
[1] 84253 segmentation fault ./target/release/linkfoo
Cargo.toml
[package]
name = "linkfoo"
version = "0.1.0"
authors = ["Nate Mara <nathan.mara@kroger.com>"]
[dependencies]
libloading = "0.3.0"
[lib]
name = "foo"
crate-type = ["dylib"]
main.rs
extern crate libloading as lib;
fn main() {
let dylib = lib::Library::new("./target/release/libfoo.dylib").expect("Failed to load library");
let func = unsafe {
let wrapped_func: lib::Symbol<fn(&[i32]) -> Vec<i32>> = dylib.get(b"alloc")
.expect("Failed to load function");
wrapped_func.into_raw()
};
let args = vec![8182];
println!("{}", func(&args).len());
}
lib.rs
#[no_mangle]
pub fn alloc(args: &[i32]) -> Vec<i32> {
let size = args[0] as usize;
let mut mat = Vec::with_capacity(size);
for _ in 0..size {
mat.push(0);
}
mat
}
【问题讨论】:
-
你使用的是什么版本的 rust 工具链?我在 El Capitan 10.11.6 上的
rustc 1.10.0 (cfcb716cf 2016-07-03)和rustc 1.12.0-nightly (feeca9457 2016-07-26)上编译并运行了您的代码,没有出现段错误。 -
我使用的是 1.10 稳定版
-
我现在可以让它崩溃了。如果您运行
rust-lldb target/release/linkfoo然后r<Enter>运行程序,您得到的段错误原因是什么?使用stop reason = EXC_BAD_ACCESS (code=1, address=0x0) frame #0: 0x0000000100026404 segfault`je_huge_dalloc [inlined] je_rtree_val_read(dependent=true) + 4 at rtree.h:193地雷炸弹 -
二进制文件的后续执行成功,没有段错误。
标签: rust