【问题标题】:Erlang: starting sellaprime app with supervisor returns undef errorErlang:使用主管启动 sellaprime 应用程序返回 undef 错误
【发布时间】:2021-08-19 06:11:40
【问题描述】:

尝试运行编程 erlang 书中的示例应用程序 sellaprime 应用程序。我使用主管内的测试功能测试了主管代码。所以,主管应该没问题。应用程序已加载,但应用程序启动遇到以下错误:

=INFO REPORT==== 31-May-2021::22:39:44.235167 ===
application: sellaprime
exited: {bad_return,
            {{sellaprime_app,start,[normal,[]]},
             {'EXIT',
                 {undef,
                     [{sellaprime_app,start,[normal,[]],[]},
                      {application_master,start_supervisor,3,
                          [{file,"application_master.erl"},{line,331}]},
                      {application_master,start_the_app,5,
                          [{file,"application_master.erl"},{line,313}]},
                      {application_master,start_it_new,7,
                          [{file,"application_master.erl"},
                           {line,299}]}]}}}}
type: temporary

需要帮助找出错误。 这是文件,sellaprime_app.erl

-module(sellaprime_app).
-behaviour(application).
-export([start/2, stop/1]).

start(_Type, StartArgs) -> sellaprime_supervisor:start_link(StartArgs).
stop(_State) -> ok.

还有sellaprime_supervisor.erl

-module(sellaprime_supervisor).
-behaviour(supervisor).

-export([start/0, start_in_shell_for_testing/0, start_link/1, init/1]).

start() -> 
    spawn(fun() -> supervisor:start_link({local, ?MODULE}, ?MODULE, _Arg=[]) end).
start_in_shell_for_testing() -> 
    {ok, Pid} = supervisor:start_link({local, ?MODULE}, ?MODULE, _Arg=[]),
    unlink(Pid).

start_link(Args) -> 
    supervisor:start_link({local, ?MODULE}, ?MODULE, Args).

init([]) ->
    gen_event:swap_handler(alarm_handler, {alarm_handler, swap}, {my_alarm_handler, xyz}),
    {ok, {{one_for_one, 3, 10},
         [{tag1, 
            {area_server, start_link, []},
            permanent, 
            10000, 
            worker, 
            [area_server]},
          {tag2, 
            {prime_server, start_link, []},
            permanent, 
            10000, 
            worker, 
            [prime_server]}
        ]}}.

【问题讨论】:

    标签: erlang erlang-supervisor


    【解决方案1】:

    这个:

    {'EXIT',
                     {undef,
                         [{sellaprime_app,start,[normal,[]],[]},
    

    是说有一个undef 错误,即在模块sellaprime_app 中没有定义名为start() 的函数,它接受两个参数:[normal, []]。但是,如果您查看您的sellaprime_app.erl,显然有一个名为start() 的函数,它被定义为接受任意两个参数。那到底是怎么回事?

    问题是书上没有指导你编译sellaprime_app.erl文件来创建需要的.beam文件,所以erlang找不到里面的函数。对于所有其他源文件,您将遇到同样的问题。可以使用命令行编译一个目录下的所有.erl文件,像这样:

    $ erlc *.erl
    

    完成此操作后,您将在目录中看到 .beam 文件。然后你可以这样做:

    $ erl -boot start_sasl -config elog3
    

    ...接下来是本书中显示的其余命令。

    rebar3 之类的工具负责为您完成所有编译并将.beam 文件组织到其他目录并添加它们的路径,但是当您手动运行应用程序时不会发生这种情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-06
      • 2018-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-04
      • 2023-03-23
      相关资源
      最近更新 更多