HarmonyOS鸿蒙Next中使用Node-Api(napi)开发,应用运行过程中闪退,出现cppcrash
HarmonyOS鸿蒙Next中使用Node-Api(napi)开发,应用运行过程中出现高概率闪退,有cppcrash栈,栈顶为系统库libark_jsruntime.so,崩溃栈前几帧也有libace_napi.z.so,怎么进行定位解决呢?
复现了好几次,每次崩溃栈长得都不太一样,但是共性都是:崩溃栈顶是系统库的libark_jsruntime.so,有时候是libace_napi.z.so
使用napi时如果出现高概率闪退,崩溃栈顶在系统库libark_jsruntime.so,这一般是你napi接口使用不当导致。我这边有一些之前定位问题的思路,可以给你作为参考。
- 排查是否存在多线程安全问题(从你描述来看,大概率是这个问题)
ide里面有开关,直接打开开关之后,重新编个包再跑一下,看看崩溃栈是不是符合下面这个文档的描述,如果是,那就是在使用napi时,存在多线程安全问题。
方舟运行时检测-线程问题检测-运行态检测-稳定性检测-稳定性-应用质量 - 华为HarmonyOS开发者
开发,应用运行过程中闪退,出现cppcrash的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
多谢,确实是多线程安全问题,
在HarmonyOS鸿蒙Next中使用Node-Api(napi)开发时,应用闪退且崩溃栈顶在系统库libark_jsruntime.so
或libace_napi.z.so
,可能是由于napi接口使用不当或内存问题导致。首先,检查napi接口调用是否符合规范,确保参数传递正确。其次,使用hdc
工具抓取崩溃日志,分析具体崩溃点。最后,确认是否存在内存泄漏或越界访问,可通过Valgrind
等工具进行内存检测。
从崩溃栈来看,这是典型的Node-API(N-API)使用不当导致的JS运行时崩溃。
常见原因分析:
- 内存管理问题:未正确释放napi_value或napi_ref
- 线程安全问题:跨线程调用N-API接口
- 异步回调问题:napi_async_work未正确处理complete回调
- 类型转换错误:JS/C++类型不匹配
- 空指针访问:未检查napi_get_value_*返回值
排查步骤:
- 检查所有N-API调用是否都有错误检查
- 确认跨线程调用时使用了napi_threadsafe_function
- 检查napi_async_work的execute和complete回调实现
- 使用DevEco Studio的Native Memory Profiler检查内存泄漏
典型修复方案:
- 确保每个napi_create_*都有对应的释放
- 异步操作完成后必须调用napi_delete_async_work
- 跨线程访问必须通过napi_get_uv_event_loop同步
建议提供更完整的崩溃栈信息和相关代码片段,可以进一步分析具体是哪种N-API使用不当导致的崩溃。这类问题通常通过规范N-API使用方式即可解决。