为什么我的Erlang应用程序会崩溃?

为什么我的Erlang应用程序会崩溃?,erlang,thrift,otp,rebar,erl,Erlang,Thrift,Otp,Rebar,Erl,我正在构建一个简单的erlang应用程序,而且对环境非常陌生,所以我很难理解我遇到的一些错误。我不确定我的问题的根源是什么,因此如果有任何相关内容我没有发布,请让我知道: 我正在运行的模块的源代码: -module(basilisk_server). -author("Oak"). -export([start_link/2,start/0,start/1,start/2, stop/1]). -behaviour(application). -record(options

我正在构建一个简单的erlang应用程序,而且对环境非常陌生,所以我很难理解我遇到的一些错误。我不确定我的问题的根源是什么,因此如果有任何相关内容我没有发布,请让我知道:

我正在运行的模块的源代码:

  -module(basilisk_server).
  -author("Oak").

  -export([start_link/2,start/0,start/1,start/2, stop/1]).
  -behaviour(application).
  -record(options,{
    port = 6890,
    server_opts = []
  }).
  -define(LocalIP,"192.168.64.128").
  start()->
    start([]).
  start(Args)->
    #options{port = Port, server_opts = ServerOpts}  = parse_args(Args),
    spawn(
      fun() ->
        start_link(Port, ServerOpts),
        receive after infinity -> ok end
      end)
  .
  start(_StartType, Args) ->
    start(Args).

  parse_args(Args) -> parse_args(Args, #options{}).
  parse_args([], Opts) -> Opts;
  parse_args([Head | Rest], Opts) ->
    NewOpts =
      case catch list_to_integer(Head) of
        Port when is_integer(Port) ->
          Opts#options{port = Port};
        _Else ->
          case Head of
            "framed" ->
              Opts#options{server_opts = [{framed, true} | Opts#options.server_opts]};
            "" ->
              Opts;
            _Else ->
              erlang:error({bad_arg, Head})
          end
      end,
    parse_args(Rest, NewOpts)
  .
  stop(_State) ->
    ok.

  start_link(Port, ServerOpts) ->
    io:format("Starting server on port ~p with args: ~p~n",[Port,ServerOpts]),

    Services =
      [
        {"AuthenticationService",authenticationService_thrift},
        {"UserRegistrationService",userRegistrationService_thrift}
      ]
    ,
    {ok, _} = thrift_socket_server:start([
      {ip, ?LocalIP},

      {port, Port},
      {name, ?MODULE},
      {service, Services},
      {handler,[
        {"error_handler",  thrift_error_handler},
        {"AuthenticationService",authentication_service},
        {"UserRegistrationService",user_registration_service}
      ]},
      {socket_opts, [{recv_timeout, infinity}]}
    ]++
    ServerOpts).
我运行
application:start(basilisk\u服务器)。
并按以下顺序获取这些消息:

   {error,{bad_return,{{basilisk_server,start,[normal,[]]},
                      <0.38.0>}}}

  =INFO REPORT==== 29-Jul-2014::03:11:06 ===
      application: basilisk_server
      exited: {bad_return,{{basilisk_server,start,[normal,[]]},<0.38.0>}}
      type: temporary

  =ERROR REPORT==== 29-Jul-2014::03:11:06 ===
  Error in process <0.38.0> with exit value: {terminated,[{io,format,
 [<0.36.0>,"Starting server on port ~p with args: ~p~n",[6890,[]]],[]},
 {basilisk_server,start_link,2,[{file,"src/basilisk_server.erl"},{line,55}]}, 
 {basilisk_server,'-start/1-fun-0-',2,[{file,"src/basilisk_serve... 
{error,{bad_return,{{basilisk_server,start,[normal,[]]},
}}}
=信息报告===2014年7月29日::03:11:06===
应用:basilisk_服务器
退出:{bad_return,{{basilisk_server,start,[normal,[]]},}
类型:临时
=错误报告===2014年7月29日::03:11:06===
进程中存在错误,退出值为:{终止,[{io,格式,
[,“正在端口~p上启动服务器,参数为:~p~n”,[6890,[]],[]},
{basilisk_server,start_link,2,[{文件,“src/basilisk_server.erl”},{line,55}]},
{basilisk_服务器,'-start/1-fun-0-',2,[{文件,”,src/basilisk_服务器。。。

我遇到的主要问题是确定错误的实际来源。我的印象是,
io:format
在短时间内是个问题,但我认为这是一个“转移注意力的问题”"这个糟糕的结果是我的问题的根源。我在几乎相同的状态下运行程序,它正在工作,突然出现了这个错误。我回滚了大部分更改,但它没有停止。我还尝试重新启动,以防后台进程出现问题。

您使用的是
应用程序:start
,它ECT您的模块遵守
应用程序的行为

也就是说:它将调用
foo:start/2
,告诉您应用程序正在启动。您将返回
{ok,Pid}
。这在OTP设计原则的“应用程序”中有说明

但是,您的
start
函数立即调用
spawn
,并使用其结果。由于
spawn
返回
Pid
,而不是
{ok,Pid}
应用程序:start
抱怨预期结果不匹配

这就是为什么您会看到
错误返回

{error,{bad_return,{{basilisk_server,start,[normal,[]]},
                  <0.38.0>}}}
{error,{bad_return,{{basilisk_server,start,[normal,[]]},
}}}
这说明您遇到了一个
错误
,类型为
错误返回
。它发生在调用
basilisk_服务器时:start(normal,[])
,返回值为
(一个pid)

哦,另一个错误是因为你使用了<代码> StaskLink ,这意味着你的两个进程是链接的。当一个死亡时,另一个进程将被杀死。这就是你看到的<代码>终止的<代码>。其他跑步

此外,假定应用程序启动根管理器(这就是返回的pid的用途)


此时,您不需要
应用程序
行为。事实上,我不认为您需要大部分代码。只需调用
thrift_socket_server:start
并完成它。它将继续在后台运行。

您使用的是
应用程序:start
,它希望您的模块遵守的要求de>应用程序
行为

也就是说:它将调用
foo:start/2
,告诉您应用程序正在启动。您将返回
{ok,Pid}
。这在OTP设计原则的“应用程序”中有说明

但是,您的
start
函数立即调用
spawn
,并使用其结果。由于
spawn
返回
Pid
,而不是
{ok,Pid}
应用程序:start
抱怨预期结果不匹配

这就是为什么您会看到
错误返回

{error,{bad_return,{{basilisk_server,start,[normal,[]]},
                  <0.38.0>}}}
{error,{bad_return,{{basilisk_server,start,[normal,[]]},
}}}
这说明您遇到了一个
错误
,类型为
错误返回
。它发生在调用
basilisk_服务器时:start(normal,[])
,返回值为
(一个pid)

哦,另一个错误是因为你使用了<代码> StaskLink ,这意味着你的两个进程是链接的。当一个死亡时,另一个进程将被杀死。这就是你看到的<代码>终止的<代码>。其他跑步

此外,假定应用程序启动根管理器(这就是返回的pid的用途)


此时,您不需要
应用程序
行为。事实上,我不认为您需要大部分代码。只需调用
thrift_socket_server:start
并完成它。它将继续在后台运行。

我正在寻找start的预期结果,但找不到,谢谢(我翻阅了我这里的书,书中没有提到,我读了那个例子,但推断“它应该返回最高主管的pid”,意思是简单地返回pid)。另外,我删掉了我发布的示例的大部分代码,该行为比这里显示的做得更多。感谢澄清。我一直在寻找start的预期结果,但没有找到它,谢谢(我在这里翻阅了我的书,它没有提到它,我阅读了该示例,但推断出“预计返回最高主管的pid”表示仅返回pid)。另外,我删掉了我发布的示例的大部分代码,该行为比这里看起来做得更多。感谢您的澄清。在给出有效答案否决该问题后,这不是一段…有趣的…时间吗?这不是一段…有趣的…时间吗