JSVM OH_JSVM_GetNamedProperty 发生 Signal:SIGBUS(BUS_ADRALN) 错误 - HarmonyOS 鸿蒙Next

JSVM OH_JSVM_GetNamedProperty 发生 Signal:SIGBUS(BUS_ADRALN) 错误 - HarmonyOS 鸿蒙Next

设备版本:5.0.0.126 (SP8C00E126R5P28patch01)

IDE 版本:5.0.7.210

SDK 版本:5.0.2.126 (API Version 14 Release)

问题描述:

在调用 OH_JSVM_GetNamedProperty 时有概率发生标题的 Signal:SIGBUS(BUS_ADRALN) 错误。

代码片段:

```javascript
JSVM_Value handleOplog(MMCall *call, HandleOplogData *data) {
    JSVM_Env env = currentVm.env;
    auto req = jsvm_createArrayBuffer(env, data->data, data->dataLength);

    auto fn = jsvm_runJS(env, "((req) => {return currentDriver.handleOplog(new Uint8Array(req))})");

    JSVM_Value global;
    OH_JSVM_GetGlobal(env, &global);
    JSVM_Value invokePromise;
    JSVM_Ref invokePromiseRef;
    JSVM_CALL(OH_JSVM_CallFunction(env, global, fn, 1, &req, &invokePromise));

    // 保留引用,避免被回收
    JSVM_CALL(OH_JSVM_CreateReference(env, invokePromise, 1, &invokePromiseRef));

    jsvm_waitJobs(env, *currentVm.vm);

    JSVM_CallbackStruct thenFnCb{
         -> JSVM_Value {
            MMCall *call;
            size_t argc = 1;
            JSVM_Value args;
            OH_LOG_DEBUG(LOG_APP, "Promise resolved");
            OH_JSVM_GetCbInfo(env2, info2, &argc, &args, nullptr, (void **)&call);
            // Uint8Array.buffer
            JSVM_Value buffer = jsvm_getProperty(env2, args, "buffer");

            int32_t byteLength;
            OH_JSVM_GetValueInt32(env2, jsvm_getProperty(env2, args, "byteLength"), &byteLength);
            int32_t byteOffset;
            OH_JSVM_GetValueInt32(env2, jsvm_getProperty(env2, args, "byteOffset"), &byteOffset);

            void *data;
            size_t dataLength;
            OH_JSVM_GetArraybufferInfo(env2, buffer, &data, &dataLength);

            endCallRaw(call, ((uint8_t *)data) + byteOffset, byteLength);
            return nullptr;
        },
        (void *)call};
    JSVM_CallbackStruct catchFn{ -> JSVM_Value {
                                    MMCall *call;
                                    size_t argc;
                                    OH_JSVM_GetCbInfo(env2, info2, &argc, nullptr, nullptr, (void **)&call);
                                    OH_LOG_ERROR(LOG_APP, "Error occurred");
                                    endCall(call, "{}");
                                    return nullptr;
                                },
                                (void *)call};


    jsvm_waitPromise(env, *currentVm.vm, &invokePromise, &thenFnCb, &catchFn);
    JSVM_CALL(OH_JSVM_DeleteReference(env, invokePromiseRef));
    return nullptr;
}

JSVM_Value jsvm_waitPromise(JSVM_Env env, JSVM_VM vm, JSVM_Value *promise, JSVM_CallbackStruct *thenCb,
                            JSVM_CallbackStruct *catchCb // optional
) {
    JSVM_Value promiseThen;
    JSVM_Value promiseCatch;
    JSVM_Value thenFn;
    JSVM_Value catchFn;
    JSVM_Value result;

    JSVM_CALL(OH_JSVM_GetNamedProperty(env, *promise, "then", &promiseThen));
    JSVM_CALL(OH_JSVM_CreateFunction(env, "cb", JSVM_AUTO_LENGTH, thenCb, &thenFn));
    JSVM_CALL(OH_JSVM_CallFunction(env, *promise, promiseThen, 1, &thenFn, &result));

    if (catchCb != nullptr) {
        JSVM_CALL(OH_JSVM_GetNamedProperty(env, *promise, "catch", &promiseCatch));
        JSVM_CALL(OH_JSVM_CreateFunction(env, "cb", JSVM_AUTO_LENGTH, catchCb, &catchFn));
        JSVM_CALL(OH_JSVM_CallFunction(env, *promise, promiseCatch, 1, &catchFn, &result));
    }

    jsvm_waitJobs(env, vm);
    return nullptr;
}

更多关于JSVM OH_JSVM_GetNamedProperty 发生 Signal:SIGBUS(BUS_ADRALN) 错误 - HarmonyOS 鸿蒙Next的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

1)代码中的thenFnCb 和 catchFn 都是分配在栈上的局部变量,后面jsvm_waitPromise在调用的时候传的是地址,栈内存的东西会被系统自动回收修改,后面再去访问可能会造成非法内存访问。

2)建议用new的方式去创建

3)参考链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs-V5/faqs-jsvm-1-V5

更多关于JSVM OH_JSVM_GetNamedProperty 发生 Signal:SIGBUS(BUS_ADRALN) 错误 - HarmonyOS 鸿蒙Next的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


报错信息
Device info:HUAWEI Mate 60 Pro
Build info:ALN-AL00 5.0.0.126(SP8C00E126R5P28)
Fingerprint:e71c83c1b59b75675ba4078e9c20e6d1e185f3c195a86842a9e29dc0977f2ad7
Module name:com.maimemo.huawei.momo
Version:5.4.20
VersionCode:1000000
PreInstalled:No
Foreground:Yes
Timestamp:2025-03-03 18:29:55.763
Pid:24388
Uid:20020172
Process name:com.maimemo.huawei.momo
Process life time:12s
Reason:Signal:SIGBUS(BUS_ADRALN)@0x0000005d7d5841ef
Fault thread info:
Tid:24500, Name:emo.huawei.momo
#00 pc 00000000018b3640 /system/lib64/ndk/libjsvm.so(v8::internal::LookupIterator::State v8::internal::LookupIterator::LookupInRegularHolder<false>(v8::internal::Map, v8::internal::JSReceiver)+152)
#01 pc 00000000018b09ec /system/lib64/ndk/libjsvm.so(void v8::internal::LookupIterator::Start<false>()+148)
#02 pc 00000000018b09ec /system/lib64/ndk/libjsvm.so(void v8::internal::LookupIterator::Start<false>()+148)
#03 pc 0000000001a21d10 /system/lib64/ndk/libjsvm.so(v8::internal::Runtime::GetObjectProperty(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Object>, bool*)+204)
#04 pc 0000000001432f64 /system/lib64/ndk/libjsvm.so(v8::Object::Get(v8::Local<v8::Context>, v8::Local<v8::Value>)+152)
#05 pc 0000000000c6c978 /system/lib64/ndk/libjsvm.so(OH_JSVM_GetNamedProperty+388)
#06 pc 000000000000e9cc /data/storage/el1/bundle/libs/arm64/libstudy_core.so(jsvm_waitPromise(JSVM_Env__, JSVM_VM__, JSVM_Value__**, JSVM_CallbackStruct*, JSVM_CallbackStruct*)+80)(97a848c15da455e77907fc757b281273ed1d5b0a)
#07 pc 0000000000010f80 /data/storage/el1/bundle/libs/arm64/libstudy_core.so(handleOplog(MMCall*, HandleOplogData*)+676)(97a848c15da455e77907fc757b281273ed1d5b0a)
#08 pc 0000000000011328 /data/storage/el1/bundle/libs/arm64/libstudy_core.so(Worker()+620)(97a848c15da455e77907fc757b281273ed1d5b0a)
#09 pc 0000000000013738 /data/storage/el1/bundle/libs/arm64/libstudy_core.so(97a848c15da455e77907fc757b281273ed1d5b0a)
#10 pc 00000000000136d0 /data/storage/el1/bundle/libs/arm64/libstudy_core.so(97a848c15da455e77907fc757b281273ed1d5b0a)
#11 pc 00000000000131d0 /data/storage/el1/bundle/libs/arm64/libstudy_core.so(97a848c15da455e77907fc757b281273ed1d5b0a)
#12 pc 00000000001badf4 /system/lib/ld-musl-aarch64.so.1(start+236)(5d3371054f92e8925889547e8114fb59)
Signal:SIGBUS(BUS_ADRALN) 错误通常是由于内存访问未对齐导致的。在鸿蒙系统中,`OH_JSVM_GetNamedProperty` 是用于从 JavaScript 对象中获取指定属性的函数。当发生此错误时,可能是以下原因之一:

1. 内存对齐问题:`OH_JSVM_GetNamedProperty` 函数的参数或返回值的地址未对齐。鸿蒙系统要求某些数据类型在内存中按特定字节对齐,如果未对齐,会导致 `SIGBUS` 错误。

2. 无效指针:传递给 `OH_JSVM_GetNamedProperty` 的指针可能指向了无效的内存地址,或者指针本身为空指针。

3. 数据类型不匹配:在调用 `OH_JSVM_GetNamedProperty` 时,可能传递了不匹配的数据类型,导致函数内部处理时出现内存访问错误。

4. 多线程问题:如果在多线程环境下调用 `OH_JSVM_GetNamedProperty`,可能会出现竞态条件,导致内存访问错误。

5. 系统资源不足:系统内存资源不足时,可能导致内存分配失败,进而引发 `SIGBUS` 错误。

要解决此问题,建议检查传递给 `OH_JSVM_GetNamedProperty` 的参数,确保内存地址对齐、指针有效、数据类型匹配,并排除多线程竞态条件和系统资源不足的情况。
回到顶部