4

毎日、サーバーに新しい Erlang クラッシュ レポートがあります。ejabberd は私が使用する唯一の Erlang であるため、これがクラッシュの原因であるに違いありません。

ログファイル ( erl_crash.dump) には約 9,000 行あるため、デバッグ方法がわかりません。しかし、そのログファイルで「ejabberd」を検索したところ、5 回出現し、すべての出現は「ejabberdctl」に関連するものでした。

exec()プログラムでユーザーを作成するために、PHP スクリプト ( ) を介して ejabberdctl に対処しています。それが(どういうわけか)クラッシュの原因でしょうか?

ディレクトリで、とに/var/log/ejabberdエラーが見つかりました。しかし、私はそれらを解決する方法を本当に知りません:erlang.logejabberd.log

=ERROR REPORT====
Mnesia('ejabberd@MYHOST'): ** ERROR ** (core dumped to file: "/var/lib/ejabberd/MnesiaCore.ejabberd@MYHOST_...")
 ** FATAL ** mnesia_monitor crashed: {badarg,
                                      [{ets,lookup,
                                        [mnesia_decision,
                                         'ejabberdctl@MYHOST']},
                                       {mnesia_recover,has_mnesia_down,1},
                                       {mnesia_monitor,handle_info,2},
                                       {gen_server,handle_msg,5},
                                       {proc_lib,init_p_do_apply,3}]} state: {state,
                                                                              <0.65.0>,
                                                                              [],
                                                                              [],
                                                                              true,
                                                                              [],
                                                                              undefined,
                                                                              []}

=ERROR REPORT====
Mnesia('ejabberd@MYHOST'): ** WARNING ** Mnesia is overloaded: {dump_log,
                                                                           time_threshold}

=CRASH REPORT====
  crasher:
    initial call: ejabberd_listener:init/3
    pid: <0.366.0>
    registered_name: []
    exception exit: {timeout,
                        {gen_server,call,
                            [<0.682.0>,{become_controller,<0.685.0>}]}}
      in function  gen_server:call/2
      in call from ejabberd_listener:accept/3
    ancestors: [ejabberd_listeners,ejabberd_sup,<0.39.0>]
    messages: [{#Ref<0.0.0.11304>,ok}]
    links: [#Port<0.2761>,<0.274.0>]
    dictionary: []
    trap_exit: false
    status: running
    heap_size: 2584
    stack_size: 24
    reductions: 20938
  neighbours:
4

5 に答える 5

4

このerl_crash.dumpファイルには、Erlang VM がクラッシュした瞬間のほぼすべての状態が含まれています。それを分析するためのツールがあります。

  1. Erlang シェルを開始し、webtool を開始します。

    somebody@somehost> erl
    Erlang R15B02 (erts-5.9.2) [source] [smp:2:2] [async-threads:0] [kernel-poll:false]
    
    Eshell V5.9.2  (abort with ^G)
    1> webtool:start().
    WebTool is available at http://localhost:8888/
    Or  http://127.0.0.1:8888/
    {ok,<0.35.0>}
    2> 
    
  2. ブラウザで上記のアドレスに移動し、WebTool -> Start Tools -> CrashDumpViewer -> Start、次にCrashDumpViewer -> Load Crashdumpをクリックします。

  3. 一般情報でスローガンを探してください。クラッシュの要約された理由です。

  4. Waiting以外の状態のプロセスを探します。これらのプロセスは、Erlang VM がクラッシュしている間に何かを行っています。おそらくソースです。

于 2013-01-23T11:11:34.020 に答える
2

ejabberdctl は 1 回しか実行できません。PHP から 2 回実行すると、ノードの命名で競合が発生し、クラッシュが発生します。

コードから ejabberdctl を使用せず、API に依存してください。

于 2013-01-27T20:18:06.713 に答える
0

彼らはあなたが二度ストリングス・エジャバードされている可能性はありますか?

于 2013-01-23T05:58:35.790 に答える
0

erlang.log ログ ファイルはありますか? もしそうなら、クラッシュに関する良い情報がそこにあるはずです。

于 2013-01-23T22:53:18.997 に答える
0

ssh ポート フォワーディングを使用して、webtool をローカル マシンにエクスポートし、ブラウザでそれを指定できます。それをインターネット全体に公開することは、おそらく悪いセキュリティ エラーになるでしょう。

于 2013-01-26T22:30:10.143 に答える