gpt4 book ai didi

macos - 从 dylib 返回时 macOS 上的段错误

转载 作者:行者123 更新时间:2023-11-29 08:32:47 30 4
gpt4 key购买 nike

我的 Rust 程序加载 Rust 编写的动态库以提高模块化。在Linux上运行流畅,但在macOS上第三次返回时出现segmentation fault。

昨天的问题比这个更糟,在 macOS 上,它在第一次调用时是这样的:

rustegram(4467,0x7fffad81d340) malloc: *** error for object 0x106817040: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6

在调试过程中,我发现问题出在使用对象作为函数调用参数。它们都是 String,因此将它们转换为 &str 解决了问题。

现在我需要传递复杂的值比如 serde_json::value::Valuetoml::Value

pub struct Plugin {
name: String,
config: TomlValue,
plugins: Vec<Arc<Lib>>,
}

impl Plugin {
pub fn run(&self, secret: String, body: JsonValue) -> Result<JsonValue, String> {
if self.plugins.len() > 0 {
// In a real program you want to cache the symbol and not do it every time if your
// application is performance critical
match unsafe { self.plugins[0].lib.get(b"init_bot\0") } {
Ok(temp) => {
let f: Symbol<extern "C" fn(config: &TomlValue, secret: &str, body: &JsonValue) -> Result<JsonValue, String>> = temp;
//on mac it goes "segmentation fault" returning from the third call
println!("DEBUG: before");
let res = f(&self.config.clone(), &secret.clone(), &body.clone());
println!("DEBUG: after");
res
},
Err(e) => Err(format!("Error getting Symbol for {}: {}", self.name, e)),
}
}
else {
Err(format!("Lib {} not loaded", self.name))
}
}
}

在被调用的方法里面,我放了三个调试println! "A""B"and "C",一个在每个操作之前。输出是:

DEBUG: before
A
B
C
DEBUG: after
DEBUG: before
A
B
C
DEBUG: after
DEBUG: before
A
B
C
Segmentation fault: 11

有时,它不会给出段错误,而是给出“非法指令:4”。

完整代码可以看my GitHub project .

最佳答案

正如 Matthieu M. 所指出的,我没有正确取消引用。

在库方面:

pub extern fn init_bot(ptr_config: *const TomlValue, secret: &str, ptr_body: *const JsonValue) -> Result<JsonValue, String>

在应用程序方面:

let f: Symbol<extern "C" fn(config: *const TomlValue, secret: &str, body: *const JsonValue) -> Result<JsonValue, String>> = temp;
f(Box::into_raw(Box::new(self.config.clone())), &secret, Box::into_raw(Box::new(body)))

关于macos - 从 dylib 返回时 macOS 上的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48880421/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com