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]}の場合があるらしい。
これで、ちょっとだけ進展。