erlang on_load_function_failed排查过程解析
在做mongo建连优化时,突然发现打出的包无法启动。有日志如下:
{ Kernel pid terminated ,application_controller, {application_start_failure,kernel,{{shutdown,{failed_to_start_child,kernel_safe_sup,{on_load_function_failed,fast_pbkdf2}}},{kernel,start,[normal,[]]}}} }
Kernel pid terminated (application_controller) ({application_start_failure,kernel,{{shutdown,{failed_to_start_child,kernel_safe_sup,{on_load_function_failed,fast_pbkdf2}}},{kernel,start,[normal,[]]}}}
原因是打包机的环境变更,导致:
root@xxxxx:/srv/apps/xxxxx/lib/fast_pbkdf2-1.0.5/priv# ldd fast_pbkdf2.so linux-vdso.so.1 = (0x00007ffc71bc6000) libcrypto.so.1.1 = not found libc.so.6 = /lib/x86_64-linux-gnu/libc.so.6 (0x00007faf60b69000) /lib64/ld-linux-x86-64.so.2 (0x00007faf61139000)
ldd 命令发现真正问题:打包机安装mongodb后,fast_pbkdf2.so link到了libcrypto.so.1.1,而之前是 libcrypto.so.1.0.0,我本地开发环境有libcrypto.so.1.1,故a, b都可运行,而生产容器只有 libcrypto.so.1.0.0,所以运行失败。
OTP-24.1
init.erl:1465
erlang load 失败时,会on_load_function_failed。这里除了load失败的模块,没有携带任何有效信息。
run_on_load_handlers([M|Ms], Debug) - debug(Debug, {running_on_load_handler,M}), Fun = fun() - Res = erlang:call_on_load_function(M), exit(Res) end, {Pid,Ref} = spawn_monitor(Fun), receive {'DOWN',Ref,process,Pid,OnLoadRes} - Keep = OnLoadRes =:= ok, erlang:finish_after_on_load(M, Keep), case Keep of false - Error = {on_load_function_failed,M}, debug(Debug, Error), exit(Error); true - debug(Debug, {on_load_handler_returned_ok,M}), run_on_load_handlers(Ms, Debug) end end;run_on_load_handlers([], _) - ok.
以上就是erlang on_load_function_failed 的排查的详细内容,更多关于erlang on_load_function_failed 的排查的资料请关注8b8.cn其它相关文章!
erlang on_load_function_failed排查过程解析