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 回复
报错信息
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` 的参数,确保内存地址对齐、指针有效、数据类型匹配,并排除多线程竞态条件和系统资源不足的情况。