Closed AuTsing closed 2 years ago
你好,指导不敢当,这里也遇到了跟你一样的错误:https://github.com/denoland/deno/issues/13936
addr2line
定位了报错的位置吗?我上次用过,不过偏移地址都是虚拟地址,定位出来都是错误的。真机,是ARM64的
编译好的so直接放在工程目录
工程目录为 D:\OneDrive\Gits\Java\DenoUser
具体目录为 D:\OneDrive\Gits\Java\DenoUser\app\libs\arm64-v8a
编译命令为 build.sh
#!/bin/bash
export CC=/home/autsing/Apps/androidSdk/ndk/android-ndk-r21e/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang export AR=/home/autsing/Apps/androidSdk/ndk/android-ndk-r21e/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar export CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER=/home/autsing/Apps/androidSdk/ndk/android-ndk-r21e/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang
cargo build --target aarch64-linux-android
cp ./target/aarch64-linux-android/debug/libdenouser.so ~/OneDrive/Gits/Java/DenoUser/app/libs/arm64-v8a/
4. 有使用addr2line定位错误的,具体可以看上面一楼,我感觉应该没有错的,是在
_runtime.rs_
```rust
if !has_startup_snapshot {
let realm = js_runtime.global_realm();
js_runtime.init_extension_js(&realm).unwrap(); //就是这一行报的错误
}
use deno_core::JsRuntime;
use deno_core::RuntimeOptions;
pub fn run_main() { let mut runtime = JsRuntime::new(RuntimeOptions::default());
runtime
.execute_script("<usage>", " Deno.core.print('hello world!');")
.unwrap();
}
是报相同的错误的
根据你上面给到的链接 https://github.com/denoland/deno/issues/13936#issuecomment-1095327823 这一条似乎给到了我一些思路
似乎并不奏效,我把测试代码简化成
use deno_core::JsRuntime;
use deno_core::RuntimeOptions;
pub fn run_main() {
JsRuntime::new(RuntimeOptions::default());
}
但他依然会报错,并且我根据他所说的,另起一个线程,依然会报相同的错误😂
Thread {
Log.d(TAG, "onCreate: ${stringFromRustJNI()}")
runTest()
}.start()
似乎并不奏效,我把测试代码简化成
use deno_core::JsRuntime; use deno_core::RuntimeOptions; pub fn run_main() { JsRuntime::new(RuntimeOptions::default()); }
但他依然会报错,并且我根据他所说的,另起一个线程,依然会报相同的错误😂
Thread { Log.d(TAG, "onCreate: ${stringFromRustJNI()}") runTest() }.start()
你要不要把代码提交一下,我也试试看行不行😂
我每次遇到signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr
这种错误,都是js代码有问题,要不要尝试这个看看:
fn main() {
let mut runtime = JsRuntime::new(RuntimeOptions::default());
// Evaluate some code
let code = "let a = 1+4; a*2";
let output: serde_json::Value =
eval(&mut runtime, code).expect("Eval failed");
println!("Output: {:?}", output);
let expected_output = serde_json::json!(10);
assert_eq!(expected_output, output);
}
fn eval(
context: &mut JsRuntime,
code: &str,
) -> Result<serde_json::Value, String> {
let res = context.execute_script("<anon>", code);
match res {
Ok(global) => {
let scope = &mut context.handle_scope();
let local = v8::Local::new(scope, global);
// Deserialize a `v8` object into a Rust type using `serde_v8`,
// in this case deserialize to a JSON `Value`.
let deserialized_value =
serde_v8::from_v8::<serde_json::Value>(scope, local);
match deserialized_value {
Ok(value) => Ok(value),
Err(err) => Err(format!("Cannot deserialize value: {:?}", err)),
}
}
Err(err) => Err(format!("Evaling error: {:?}", err)),
}
}
目前就我的纯个人想法 就根据你之前所说的,你说是快照出现问题,我猜问题就出现在这个快照这里 我单独运行v8的demo是不会报错的 而在v8的上一层也就是在deno_core这一层出现了错误 对于deno_core我没有仔细阅读这里面的代码,但在这一层似乎就已经用到了快照 上面的报错的堆栈追踪似乎也看到了快照的踪影 而你说使用ARM64进行编译就没有问题 根据官方的说法,快照是不能交叉编译的 所以我就大致猜测会不会就是编译导致的
所以我目前的想法就是想尝试先在ARM64下编译看看 因为docker用得比较少而且没有尝试过模拟平台,所以进度有点缓慢😂
我这边的demo稍后上传上来,你也可以试下能不能复现
目前就我的纯个人想法 就根据你之前所说的,你说是快照出现问题,我猜问题就出现在这个快照这里 我单独运行v8的demo是不会报错的 而在v8的上一层也就是在deno_core这一层出现了错误 对于deno_core我没有仔细阅读这里面的代码,但在这一层似乎就已经用到了快照 上面的报错的堆栈追踪似乎也看到了快照的踪影 而你说使用ARM64进行编译就没有问题 根据官方的说法,快照是不能交叉编译的 所以我就大致猜测会不会就是编译导致的
所以我目前的想法就是想尝试先在ARM64下编译看看 因为docker用得比较少而且没有尝试过模拟平台,所以进度有点缓慢😂
我这边的demo稍后上传上来,你也可以试下能不能复现
你v8的版本不是0.42.0吗?这个官方是有v8的android的库,这个我也是在x86 架构下构建的so文件。我就是rusty_v8升级到了0.48.1,然后在x86架构下交叉编译aarch64-linux-android版本的动态链接库,然后运行的时候报虚拟地址错误。而在arm64架构下交叉编译动态链接库就没问题。
上面说的快照不能交叉编译是在哪里,贴个链接看看。
是在官方仓库的build脚本里面看到的 https://github.com/denoland/deno/blob/main/cli/build.rs 第331行
根据你上面给到的链接 denoland/deno#13936 (comment) 这一条似乎给到了我一些思路
这个老哥说的不错,我提交一下,你看就懂了
OKOK,我先仔细研究一下
OKOK,我先仔细研究一下
OK,提交pr了
我跑了一下程序没有崩,但是似乎也没有输出?
啊组件可能没加载到,我看看
不能直接调用:deno_core_main::run_main();
你这样deno不知道你要运行什么模块,所以直接报错。参考:这里的写法https://github.com/denoland/deno/blob/main/runtime/examples/hello_runtime.rs
把要运行的js传递过去
我明白你的意思 但是 deno_runtime 不是对 deno_core 的封装吗? 官方也有运行 deno_core 的例子呀 https://github.com/denoland/deno/blob/main/core/examples/hello_world.rs
我试过运行 deno_runtime ,但是运行他会报 unreachable code 的错误 所以我才想尝试运行更底层的 deno_core 来定位错误
我的 https://github.com/AuTsing/denouser 里面分别有三个文件main文件,分别是调用 对 v8,deno_core,deno_runtime 的测试,其中只有 v8 是不会报错的,其余两个会报错
其中 deno_core 报错的问题,我把 demo 测试删减到最简了
use deno_core::JsRuntime;
use deno_core::RuntimeOptions;
pub fn run_main() {
JsRuntime::new(RuntimeOptions::default());
}
这样依然报错了,这个错误似乎是在 JsRuntime 初始化过程中出现的 这里只有一句代码就是初始化一个 JsRuntime 这说明这个错误应该是来自于初始化的了吧
如果你想复现我测试 deno_runtime 出现的错误你可以把我 denouser 修改后编译就能复现问题了
我觉得你说的很有道理,是我想错了。
还有就是直接引入deno_runtime是不行的,你需要在deno_runtime里面注释调deno_webgpu和deno_ffi这里是某些ABI缺失了。
我在想deno_code 是不是也是这么回事,我魔改了deno_code也是不行,我提个pr你看看,一直出现:
A/libc: Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 26205 (IntentService[D), pid 26174 (studio.denouser)
我觉得是jsRuntime超出了jni调用的限制.因为我运行test是通过的。
是的,我 test 也是没有任何错误的,具体我估计还得仔细阅读源码才能确认问题所在
至于 deno_runtime 没法直接引入的问题,我觉得起码得先搞定 deno_core 吧,如果 deno_core 的报错都没法搞定,那 deno_runtime 出现问题的话也不好解决了
用的都是官方的 v8 0.42.0 deno_core 0.134.0
具体如下
denoc.rs
lib.rs
tombstone
addr2line
根据报错的内容我已经翻到了我能定位到的具体位置了 runtime.rs
😂又没有思路了,请问你这边看了有没有什么指导意见?