4

每天我的服务器上都有一个新的 Erlang 崩溃报告。由于 ejabberd 是我使用的唯一 Erlang 的东西,这一定是崩溃的原因。

日志文件 ( erl_crash.dump) 有将近 9,000 行,所以我不知道如何调试它。但是当我在该日志文件中搜索“ejabberd”时,出现了 5 次——每一次出现都与“ejabberdctl”有关。

我正在通过 PHP 脚本 ( exec()) 处理 ejabberdctl 以编程方式创建用户。这可能是崩溃的原因(不知何故)?

/var/log/ejabberd目录中,我在erlang.log和中发现了一些错误ejabberd.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 shell 并启动 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。从您的 PHP 执行两次将在节点命名和您看到的崩溃中产生冲突。

不要从代码中使用 ejabberdctl,而是依赖 API。

于 2013-01-27T20:18:06.713 回答
0

他们有机会成为两次字符串 ejabberd 吗?

于 2013-01-23T05:58:35.790 回答
0

你有 erlang.log 日志文件吗?如果是这样,您应该在那里找到有关崩溃的好信息。

于 2013-01-23T22:53:18.997 回答
0

您可以使用 ssh 端口转发将 webtool 导出到本地计算机,您可以在其中将浏览器指向它。将其暴露给整个互联网可能是一个严重的安全错误。

于 2013-01-26T22:30:10.143 回答