Erlang:使用主管 returns undef 错误启动 sellaprime 应用程序
Erlang: starting sellaprime app with supervisor returns undef error
正在尝试 运行 来自 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]}
]}}.
这个:
{'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
文件组织到其他目录并添加它们的路径,但是当您 运行 手动申请。
正在尝试 运行 来自 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]}
]}}.
这个:
{'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
文件组织到其他目录并添加它们的路径,但是当您 运行 手动申请。