HarmonyOS鸿蒙Next中启动Native子进程后崩溃

HarmonyOS鸿蒙Next中启动Native子进程后崩溃 参考官方demo实现 创建支持参数传递的Native子进程

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/capi-nativechildprocess-development-guideline#%E5%88%9B%E5%BB%BA%E6%94%AF%E6%8C%81%E5%8F%82%E6%95%B0%E4%BC%A0%E9%80%92%E7%9A%84native%E5%AD%90%E8%BF%9B%E7%A8%8B

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

3 回复

找到崩溃原因了,外面包裹的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子进程后崩溃,通常是由于权限配置或资源访问问题导致。请检查以下配置:

  1. 确保在module.json5中正确声明了ohos.permission.SPAWN权限。
  2. 检查Native进程的入口函数(如main)实现是否正确,避免资源未初始化或访问越界。
  3. 确认使用的系统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信息看,可能原因包括:

  1. 子进程so库加载失败:确保libchildprocesssample.so已正确打包到HAP的libs/{arch}目录下,且与主进程ABI匹配。
  2. 子进程入口函数执行异常:检查Main函数实现是否符合规范,确保没有内存访问越界、未初始化指针等错误。子进程崩溃会信号传递至父进程。
  3. 资源限制或权限问题:子进程可能因资源不足(如FD数量限制)或访问权限问题(如文件路径)而崩溃。
  4. 隔离模式配置:当前使用NCP_ISOLATION_MODE_NORMAL,可尝试切换为NCP_ISOLATION_MODE_ISOLATED测试是否缓解。

排查建议

  • 在子进程Main函数起始处增加日志,确认是否执行到。
  • 检查子进程so的依赖库是否完整。
  • 确认entryParams等参数传递符合规范(如字符串以\0结尾)。
  • 捕获并处理信号(如SIGTRAP),避免崩溃扩散。

该问题需结合子进程具体实现及系统日志进一步定位。

回到顶部