erlang on_load_function_failed排查过程解析

 更新时间:2023年12月15日 08:57:41   作者:enjolras1205  
这篇文章主要为大家介绍了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)

排查过程

  • 回滚代码到可启动包代码。重新打包,也无法启动。
  • 基本判定是打包机环境变更问题。并找了打包机的管理同学。
  • 设可运行包为a,不可运行包为b,对比a, b的差异。
  • a, b包均可在开发环境正常运行。
  • nm 命令对比 a/b 的fast_pbkdf2.so symbols。
  • 用 erlang crash viewer 查看 crashdump,无有效信息。
  • 打包机管理同学发现回滚mongodb安装后问题修复。

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时,从 c/c++ 动态库加载的角度排查。
  • 打包应该保持和生产环境一致,可以用同一个docker镜像。

以上就是erlang on_load_function_failed 的排查的详细内容,更多关于erlang on_load_function_failed 的排查的资料请关注脚本之家其它相关文章!

相关文章

  • Erlang中遍历取出某个位置的最大值代码

    Erlang中遍历取出某个位置的最大值代码

    这篇文章主要介绍了Erlang中遍历取出某个位置的最大值代码,本文直接给出实现代码,需要的朋友可以参考下
    2015-03-03
  • Erlang中的注册进程使用实例

    Erlang中的注册进程使用实例

    这篇文章主要介绍了Erlang中的注册进程使用实例,本文给出正常进程通信实例和使用使用注册进程通信实例,需要的朋友可以参考下
    2015-02-02
  • Erlang实现的百度云推送Android服务端实例

    Erlang实现的百度云推送Android服务端实例

    这篇文章主要介绍了Erlang实现的百度云推送Android服务端实例,本文先是讲解了实现步骤,然后给出实现代码,需要的朋友可以参考下
    2015-01-01
  • Erlang中的函数与流程控制介绍

    Erlang中的函数与流程控制介绍

    这篇文章主要介绍了Erlang中的函数与流程控制介绍,本文先是讲解了函数的一些知识,然后讲解了case语句和if语句及算术表达式等内容,需要的朋友可以参考下
    2015-01-01
  • CentOS 6.5源码安装Erlang教程

    CentOS 6.5源码安装Erlang教程

    这篇文章主要介绍了CentOS 6.5源码安装Erlang教程,本文讲解了源码编译安装的过程和遇到的一些错误处理方法,需要的朋友可以参考下
    2015-01-01
  • 深入浅析RabbitMQ镜像集群原理

    深入浅析RabbitMQ镜像集群原理

    当单台 RabbitMQ 服务器的处理消息的能力达到瓶颈时,此时可以通过 RabbitMQ 集群来进行扩展,从而达到提升吞吐量的目的
    2021-08-08
  • Erlang中的基本元素操作小结

    Erlang中的基本元素操作小结

    这篇文章主要介绍了Erlang中的基本元素操作小结,本文讲解了元组(tuple)、记录(record)、列表(list)、映射组(map)等内容,需要的朋友可以参考下
    2015-03-03
  • Erlang中的Record详解

    Erlang中的Record详解

    这篇文章主要介绍了Erlang中的Record详解,本文讲解了定义Record、创建Record、访问Record、更新Record、匹配Record和Guard语句、使用Record等内容,需要的朋友可以参考下
    2015-04-04
  • Erlang编程语言的第一印象

    Erlang编程语言的第一印象

    这篇文章主要介绍了Erlang编程语言的第一印象,本文对Erlang做了一个简单总结,需要的朋友可以参考下
    2015-03-03
  • Erlang中的映射组Map详细介绍

    Erlang中的映射组Map详细介绍

    这篇文章主要介绍了Erlang中的映射组Map详细介绍,本文讲解了创建映射组、更新映射组、两种操作符的区别、映射的增加、删除、获取等内容,需要的朋友可以参考下
    2015-02-02

最新评论