【问题标题】:Segmentation fault doing dynamic loading in OSX在 OSX 中进行动态加载的分段错误
【发布时间】: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&lt;Enter&gt; 运行程序,您得到的段错误原因是什么?使用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


【解决方案1】:

Rust 对动态库使用系统分配器,对所有其他代码使用 jemalloc。加载程序的这种差异导致了段错误,我可以通过将其添加到 main.rs 的顶部来修复它:

#![feature(alloc_system)]
extern crate alloc_system;

【讨论】:

    猜你喜欢
    • 2015-02-04
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 2014-04-28
    • 2013-09-23
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    相关资源
    最近更新 更多