Trying to run the example app, sellaprime app, from the programming erlang book. I tested the supervisor code with the testing function within the supervisor. So, the supervisor should be OK. The application gets loaded but the application start runs into problem with below error:
=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
Need help locating the error. Here is the file, sellaprime_app.erl
:
-module(sellaprime_app).
-behaviour(application).
-export([start/2, stop/1]).
start(_Type, StartArgs) -> sellaprime_supervisor:start_link(StartArgs).
stop(_State) -> ok.
and the 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]}
]}}.
1条答案
按热度按时间mm9b1k5b1#
This:
is saying that there is an
undef
error, namely that in the modulesellaprime_app
there is no function defined calledstart()
, which takes the two arguments:[normal, []]
. But, if you look at yoursellaprime_app.erl
, there is clearly a function namedstart()
and it's defined to take any two arguments. So what's going on?The problem is that the book doesn't instruct you to compile the file
sellaprime_app.erl
to create the required.beam
file, so erlang can't find the functions therein. You will have the same problem with all the other source files. You can use the command line to compile all the.erl
files in a directory, like this:After you do that, you will see the
.beam
files in the directory. Then you can do:...followed by the rest of the commands shown in the book.
Tools like
rebar3
take care of doing all the compiling for you and organizing the.beam
files into other directories and adding their paths, but that doesn't happen when you are running applications by hand.