ejabberdのプロセスが落ちる原因を調べる(CRASH REPORTの読み方を調べた)
なんかしらんが、Pandionからチャットメッセージを投稿するとejabberdのプロセスが落ちて接続が切れてしまう。
サーバのログを見るとejabberd.logにReason for termination ってのが出てたので解析してみる。
** Reason for termination = ** {{case_clause,<<"snaka@192.168.xx.xx/Pandion">>}, [{ejabberd_c2s,check_from,2}, {ejabberd_c2s,session_established,2}, {gen_fsm,handle_msg,7}, {proc_lib,wake_up,3}]}
なんだかよくわからない。
おなじく、erlang.logに = CRASH REPORT = って出てたので調べてみる
=CRASH REPORT==== 23-Nov-2009::18:05:00 === crasher: initial call: ejabberd_c2s:init/1 pid: <0.426.0> registered_name: [] exception exit: {{case_clause,<<"snaka@192.168.xx.xx/Pandion">>}, [{ejabberd_c2s,check_from,2}, {ejabberd_c2s,session_established,2}, {gen_fsm,handle_msg,7}, {proc_lib,wake_up,3}]} in function gen_fsm:terminate/7 ancestors: [ejabberd_c2s_sup,ejabberd_sup,<0.36.0>] messages: [] links: [<0.272.0>] dictionary: [] trap_exit: false status: running heap_size: 2584 stack_size: 24 reductions: 28748 neighbours:
どうやら case_clause, ... ってのが原因をあらわしてるっぽいけどイマイチわからない。
erlangのリファレンスを探って、これの読み方を探してみる...とそれっぽい箇所が、
9.4 Exit Reasones - Erlang Reference Manual
No matching branch is found when evaluating a case expression. The value V did not match.
どうやら case文で "snaka@192.168.xx.xx/Pandion"にマッチするものがなかったために落ちているっぽい。
で、
[{ejabberd_c2s,check_from,2}, {ejabberd_c2s,session_established,2}, {gen_fsm,handle_msg,7}, {proc_lib,wake_up,3}]}
の部分が、関数呼び出しのスタックトレースっぽい、
この部分は最後に呼び出した関数が先頭になるようになっていて、タプルの各要素は
{Module, Name, Arity}
あるいは、最後の関数の場合のみ
{Module, Name, [Args]}
の場合があるらしい。
これで、ちょっとだけ進展。