私のErlangアプリケーションがクラッシュしているのはなぜですか?
質問
私はシンプルな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_server).
を実行し、この順序でこれらのメッセージを取得します。
{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...
.
主な問題は、実際のエラーの原因を識別しています。私はio:format
が短いという問題であるという印象の下にありましたが、私はそれが「赤のニシン」であり、そのbad_resultが私の問題の根本であると思います。私はプログラムをほとんど同じ状態で走っていて、それが働いていて、突然このエラーを受け始めました。私はほとんどの変化をロールバックし、それは止まっていません。バックグラウンドプロセスに問題がある場合は、再起動してみました。
解決
application:start
を使用しているため、モジュールはapplication
の動作に準拠していることを期待しています。
それは、あなたがあなたのアプリケーションが起動していることをあなたに伝えるために、それはfoo:start/2
を呼び出します。 {ok, Pid}
を返すと予想されます。これは、「アプリケーション」章のOTP設計原則に記載されています。
しかし、あなたのstart
関数は直ちにspawn
を呼び出してそれを使用します。 spawn
はPid
ではなく{ok, Pid}
を返しているため、application:start
は予想される結果の不一致について不満です。
bad_return
を見ている理由:
{error,{bad_return,{{basilisk_server,start,[normal,[]]},
<0.38.0>}}}
.
これはあなたがerror
のbad_return
を持っていることを知らせます。 basilisk_server:start(normal, [])
を呼び出すと起こり、<0.38.0>
(PID)の戻り値が得られました。
OH、もう一方のエラーはstart_link
を使用したためです。これは、2つのプロセスがリンクされていることを意味します。 1人が死んだとき、他の人は殺されます。これはあなたがterminated
で見ているものです。この場合、それはio:format
の途中で殺害されることが起こった。他のランで殺害される前にさらにそれを作るかもしれません。
さらに、アプリケーションはルートスーパーバイザを起動すると仮定されています(これは返されたPIDのものです)。
この時点では、application
の動作は不要です。実際、私はあなたがあなたのコードの大部分がまったく必要になると確信していません。 thrift_socket_server:start
を呼び出して、それを実行します。バックグラウンドで実行し続けるでしょう。