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]}

の場合があるらしい。

これで、ちょっとだけ進展。