erlang?on_load_function_failed排查過程解析
概述
在做mongo建連優(yōu)化時,突然發(fā)現(xiàn)打出的包無法啟動。有日志如下:
{"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,[]]}}}
原因是打包機(jī)的環(huán)境變更,導(dǎo)致:
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)排查過程
- 回滾代碼到可啟動包代碼。重新打包,也無法啟動。
- 基本判定是打包機(jī)環(huán)境變更問題。并找了打包機(jī)的管理同學(xué)。
- 設(shè)可運(yùn)行包為a,不可運(yùn)行包為b,對比a, b的差異。
- a, b包均可在開發(fā)環(huán)境正常運(yùn)行。
- nm 命令對比 a/b 的fast_pbkdf2.so symbols。
- 用 erlang crash viewer 查看 crashdump,無有效信息。
- 打包機(jī)管理同學(xué)發(fā)現(xiàn)回滾mongodb安裝后問題修復(fù)。
ldd 命令發(fā)現(xiàn)真正問題:打包機(jī)安裝mongodb后,fast_pbkdf2.so link到了libcrypto.so.1.1,而之前是 libcrypto.so.1.0.0,我本地開發(fā)環(huán)境有l(wèi)ibcrypto.so.1.1,故a, b都可運(yùn)行,而生產(chǎn)容器只有 libcrypto.so.1.0.0,所以運(yùn)行失敗。
代碼
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.結(jié)論
- erlang 遇到動態(tài)庫的on_load_function_failed時,從 c/c++ 動態(tài)庫加載的角度排查。
- 打包應(yīng)該保持和生產(chǎn)環(huán)境一致,可以用同一個docker鏡像。
以上就是erlang on_load_function_failed 的排查的詳細(xì)內(nèi)容,更多關(guān)于erlang on_load_function_failed 的排查的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Erlang實(shí)現(xiàn)的一個Web服務(wù)器代碼實(shí)例
這篇文章主要介紹了Erlang實(shí)現(xiàn)的一個Web服務(wù)器代碼實(shí)例,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-04-04
Erlang實(shí)現(xiàn)的百度云推送Android服務(wù)端實(shí)例
這篇文章主要介紹了Erlang實(shí)現(xiàn)的百度云推送Android服務(wù)端實(shí)例,本文先是講解了實(shí)現(xiàn)步驟,然后給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-01-01

