HarmonyOS鸿蒙Next中启动Native子进程后崩溃
HarmonyOS鸿蒙Next中启动Native子进程后崩溃 参考官方demo实现 创建支持参数传递的Native子进程
ChildProcessSample的实现与教程完全一致,并编译为so放入 entry的 libs文件夹
主进程native代码 通过napi暴露后,arkts层按钮触发。
void StartNativeChildProcess()
{
// ...
NativeChildProcess_Args args;
// 设置entryParams,支持传输的最大数据量为150KB
const size_t entryParamsSize = 10;
args.entryParams = (char *)malloc(sizeof(char) * entryParamsSize);
if (args.entryParams != nullptr) {
(void)strlcpy(args.entryParams, "testParam", entryParamsSize);
}
// 插入节点到链表头节点中
args.fdList.head = nullptr;// (NativeChildProcess_Fd *)malloc(sizeof(NativeChildProcess_Fd));
// fd关键字,最多不超过20个字符
/*args.fdList.head->fdName = (char *)malloc(sizeof(char) * g_fdNameMaxLength);
if (args.fdList.head->fdName != nullptr) {
(void)strlcpy(args.fdList.head->fdName, "fd1", g_fdNameMaxLength);
}
// 获取fd逻辑
int32_t fd = open("/data/storage/el2/base/haps/entry/files/test.txt", O_RDWR | O_CREAT, 0644);
args.fdList.head->fd = fd;
// 此处只插入一个fd记录,根据需求可以插入更多fd记录到链表中,最多不超过16个
args.fdList.head->next = NULL;
*/
NativeChildProcess_Options options = {.isolationMode = NCP_ISOLATION_MODE_NORMAL};//NCP_ISOLATION_MODE_ISOLATED};
// 第一个参数"libchildprocesssample.so:Main"为实现了子进程Main方法的动态库文件名称和入口方法名
int32_t pid = -1;
Ability_NativeChildProcess_ErrCode ret =
OH_Ability_StartNativeChildProcess("libchildprocesssample1233333333.so:Mainsss", args, options, &pid);
if (ret != NCP_NO_ERROR) {
// 子进程未能正常启动时的异常处理
// ...
// 释放内存
free(args.entryParams);
args.entryParams = nullptr;
OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RES_MGR, TAG, "StartNativeChildProcess failed");
return;
}
// 其他逻辑
// 释放内存
free(args.entryParams);
args.entryParams = nullptr;
OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RES_MGR, TAG, "StartNativeChildProcess okkkkkkk pid=%{public}d", pid);
}
问题:OH_Ability_StartNativeChildProcess 第一个入参不对时, “libchildprocesssample1233333333.so:Mainsss” 接口仍返回NCP_NO_ERROR 并崩溃。
Device info:HUAWEI MateBook Pro Build info:HAD-W24 5.1.0.320(SP36CVAC00E305R12P2)
02-06 15:42:57.360 2829-2829 A0FF00/com.…[pic2sandbox] com.…demoapp E startNativProcess sssssstart 02-06 15:42:57.360 2829-2829 C01357/com.…os/ProcessMgr com.…demoapp I [child_process_manager.cpp:118]StartChildProcessWithArgs, childProcessType:3, startWitDebug: 0, processName:, native:0, entryParams size:9, fdsSize:0, options.isolationMode:0 02-06 15:42:57.763 2829-2829 A0FF00/com.…[pic2sandbox] com.…demoapp E StartNativeChildProcess okkkkkkk pid=3907 02-06 15:42:57.763 2829-2829 C03F00/MUSL-SIGCHAIN com.…demoapp E signal_chain_handler call 2 rd sigchain action for signal: 5 sca_sigaction=59809aabdc noreturn=0 FREEZE_signo_5 thread_list_lock_status:-1 tl_lock_count=0 tl_lock_waiters=0 tl_lock_tid_fail=-1 tl_lock_count_tid=715 tl_lock_count_fail=-10000 tl_lock_count_tid_sub=715 thread_list_lock_after_lock=2829 thread_list_lock_pre_unlock=2829 thread_list_lock_pthread_exit=3738 thread_list_lock_tid_overlimit=-1 tl_lock_unlock_count=0 __pthread_gettid_np_tl_lock=0 __pthread_exit_tl_lock=0 __pthread_create_tl_lock=0 __pthread_key_delete_tl_lock=0 __synccall_tl_lock=0 __membarrier_tl_lock=0 install_new_tls_tl_lock=0 set_syscall_hooks_tl_lock=0 set_syscall_hooks_linux_tl_lock=0 fork_tl_lock=0 register_count=0 02-06 15:42:57.763 2829-2829 C02D11/DfxSignalHandler com.…demoapp I DFX_SigchainHandler :: sig(5), si_code(1), pid(2829), tid(2829). 02-06 15:42:57.763 2829-2829 C02D11/DfxSignalHandler com.…demoapp I g_GetStackIdFunc 000000000480A723. 02-06 15:42:57.763 2829-2829 C02D11/DfxSignalHandler com.…demoapp I DFX_SigchainHandler :: sig(5), pid(2829), processName(com.sion.papdemoapp), threadName(ion.papdemoapp). 02-06 15:42:57.811 2829-2829 C02D11/DfxSignalHandler com.…demoapp I start wait processdump read registers 02-06 15:42:57.816 2829-2829 C02D11/DfxSignalHandler com.…demoapp I processdump have get all registers . 02-06 15:42:57.849 2829-2829 C02D11/DfxSignalHandler com.…demoapp I start wait processdump unwind 02-06 15:42:58.194 2829-2829 C02D11/DfxSignalHandler com.…demoapp I processdump unwind finish 02-06 15:42:58.194 2829-2829 C02D11/DfxSignalHandler com.…demoapp I process dump end 02-06 15:42:58.194 2829-2829 C02D11/DfxSignalHandler com.…demoapp I Finish handle signal(5) in 2829:2829. 02-06 15:42:58.194 2829-2829 C03F00/MUSL-SIGCHAIN com.…demoapp E signal_chain_handler call usr sigaction for signal: 5 sig_action.sa_sigaction=5a0b693064 02-06 15:42:58.194 2829-2829 C03F00/MUSL-SIGCHAIN com.…demoapp E signal_chain_handler call 2 rd sigchain action for signal: 5 sca_sigaction=59809aabdc noreturn=0 FREEZE_signo_5 thread_list_lock_status:-1 tl_lock_count=0 tl_lock_waiters=0 tl_lock_tid_fail=-1 tl_lock_count_tid=715 tl_lock_count_fail=-10000 tl_lock_count_tid_sub=715 thread_list_lock_after_lock=2829 thread_list_lock_pre_unlock=2829 thread_list_lock_pthread_exit=3738 thread_list_lock_tid_overlimit=-1 tl_lock_unlock_count=0 __pthread_gettid_np_tl_lock=0 __pthread_exit_tl_lock=0 __pthread_create_tl_lock=0 __pthread_key_delete_tl_lock=0 __synccall_tl_lock=0 __membarrier_tl_lock=0 install_new_tls_tl_lock=0 set_syscall_hooks_tl_lock=0 set_syscall_hooks_linux_tl_lock=0 fork_tl_lock=0 register_count=0 02-06 15:42:58.194 2829-2829 C02D11/DfxSignalHandler com.…demoapp I DFX_SigchainHandler :: sig(5), si_code(1), pid(2829), tid(2829). 02-06 15:42:58.194 2829-2829 C03F00/MUSL-SIGCHAIN com.…demoapp E signal_chain_handler call usr sigaction for signal: 5 sig_action.sa_sigaction=59819da958 02-06 15:42:58.196 2829-3924 C01719/com.…demoapp/ffrt com.…demoapp E 20:operator():311 <<<=== ffrt black box(BBOX) start ===>>> 02-06 15:42:58.196 2829-3924 C01719/com.…demoapp/ffrt com.…demoapp E 21:SaveCurrent:73 <<<=== current status ===>>> 02-06 15:42:58.196 2829-3924 C01719/com.…demoapp/ffrt com.…demoapp E 22:SaveWorkerStatus:117 <<<=== worker status ===>>> 02-06 15:42:58.196 2829-3924 C01719/com.…demoapp/ffrt com.…demoapp E 23:SaveWorkerStatus:124 qos 3: worker tid 3070 is running nothing 02-06 15:42:58.196 2829-3924 C01719/com.…demoapp/ffrt com.…demoapp E 24:SaveWorkerStatus:124 qos 4: worker tid 3902 is running nothing 02-06 15:42:58.196 2829-3924 C01719/com.…demoapp/ffrt com.…demoapp E 25:SaveKeyStatus:157 <<<=== key status ===>>> 02-06 15:42:58.196 2829-3924 C01719/com.…demoapp/ffrt com.…demoapp E 26:SaveKeyStatus:159 no key status 02-06 15:42:58.196 2829-3924 C01719/com.…demoapp/ffrt com.…demoapp E 27:SaveReadyQueueStatus:134 <<<=== ready queue status ===>>> 02-06 15:42:58.196 2829-3924 C01719/com.…demoapp/ffrt com.…demoapp E 28:operator():321 <<<=== ffrt black box(BBOX) finish ===>>> 02-06 15:42:58.196 2829-2829 C03F00/MUSL-SIGCHAIN com.…demoapp E signal_chain_handler call 2 rd sigchain action for signal: 5 sca_sigaction=59809aabdc noreturn=0 FREEZE_signo_5 thread_list_lock_status:-1 tl_lock_count=0 tl_lock_waiters=0 tl_lock_tid_fail=-1 tl_lock_count_tid=715 tl_lock_count_fail=-10000 tl_lock_count_tid_sub=715 thread_list_lock_after_lock=2829 thread_list_lock_pre_unlock=2829 thread_list_lock_pthread_exit=3738 thread_list_lock_tid_overlimit=-1 tl_lock_unlock_count=0 __pthread_gettid_np_tl_lock=0 __pthread_exit_tl_lock=0 __pthread_create_tl_lock=0 __pthread_key_delete_tl_lock=0 __synccall_tl_lock=0 __membarrier_tl_lock=0 install_new_tls_tl_lock=0 set_syscall_hooks_tl_lock=0 set_syscall_hooks_linux_tl_lock=0 fork_tl_lock=0 register_count=0 02-06 15:42:58.196 2829-2829 C02D11/DfxSignalHandler com.…demoapp I DFX_SigchainHandler :: sig(5), si_code(1), pid(2829), tid(2829). 02-06 15:42:58.196 2829-2829 C03F00/MUSL-SIGCHAIN com.…demoapp E signal_chain_handler SIG_DFL handler for signal: 5 02-06 15:42:58.196 2829-2829 C03F00/MUSL-SIGCHAIN com.****…demoapp E pid(2829) rethrow sig(5) success.
问题2:OH_Ability_StartNativeChildProcess 第一个入参正确时同样崩溃,
"libchildprocesssample.so:Main"更多关于HarmonyOS鸿蒙Next中启动Native子进程后崩溃的实战教程也可以访问 https://www.itying.com/category-93-b0.html
找到崩溃原因了,外面包裹的napi接口没有返回一个值导致
napi_value result = 0;
napi_get_null(env, &result);
return result;
更多关于HarmonyOS鸿蒙Next中启动Native子进程后崩溃的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,启动Native子进程后崩溃,通常是由于权限配置或资源访问问题导致。请检查以下配置:
- 确保在
module.json5中正确声明了ohos.permission.SPAWN权限。 - 检查Native进程的入口函数(如
main)实现是否正确,避免资源未初始化或访问越界。 - 确认使用的系统API与当前SDK版本兼容。
崩溃日志是关键,需通过hilog查看具体错误信息定位问题。
根据日志分析,问题核心在于OH_Ability_StartNativeChildProcess接口在特定条件下会触发信号5(SIGTRAP),导致进程崩溃。这通常与子进程启动后的初始化或执行阶段有关。
问题1分析:参数错误仍返回NCP_NO_ERROR
OH_Ability_StartNativeChildProcess接口返回NCP_NO_ERROR仅表示进程创建请求已成功提交给系统,并不保证子进程能成功加载或执行。当传入错误的动态库名或入口函数名(如"libchildprocesssample1233333333.so:Mainsss")时,系统在后续加载阶段会失败,并可能向父进程发送信号导致崩溃。这是一个需要关注的异步行为。
问题2分析:参数正确时崩溃
即使参数正确("libchildprocesssample.so:Main"),崩溃仍然发生。从日志signal(5)和process dump信息看,可能原因包括:
- 子进程so库加载失败:确保
libchildprocesssample.so已正确打包到HAP的libs/{arch}目录下,且与主进程ABI匹配。 - 子进程入口函数执行异常:检查
Main函数实现是否符合规范,确保没有内存访问越界、未初始化指针等错误。子进程崩溃会信号传递至父进程。 - 资源限制或权限问题:子进程可能因资源不足(如FD数量限制)或访问权限问题(如文件路径)而崩溃。
- 隔离模式配置:当前使用
NCP_ISOLATION_MODE_NORMAL,可尝试切换为NCP_ISOLATION_MODE_ISOLATED测试是否缓解。
排查建议
- 在子进程
Main函数起始处增加日志,确认是否执行到。 - 检查子进程so的依赖库是否完整。
- 确认
entryParams等参数传递符合规范(如字符串以\0结尾)。 - 捕获并处理信号(如SIGTRAP),避免崩溃扩散。
该问题需结合子进程具体实现及系统日志进一步定位。

