【问题标题】:Erlang: No Crash DumpErlang:没有崩溃转储
【发布时间】:2013-11-23 12:27:41
【问题描述】:

我正在运行 ejabberd,但它经常崩溃。要弄清楚它崩溃的原因,我知道要查看 erl_crash.dump。问题是,似乎没有任何 erl_crash.dump 文件。虽然有一个核心转储文件。将其加载到 gdb 并运行“bt full”,这是前两帧:

(gdb) bt full
#0  0x000000000054df83 in prepare_crash_dump (secs=<optimized out>) at sys/unix/sys.c:735
    max = <optimized out>
    env = "\005", '\000' <repeats 15 times>"\200, \373!ڴ"
    heart_port = 0x7fb46f31eab0
    hp = 0x7fb4d6efb938
    heart_fd = {865035, -1}
    has_heart = 0
    i = <optimized out>
    envsz = <optimized out>
    heap = {4460060, 140412855877120, 1}
    list = 18446744073709551611
#1  erts_sys_prepare_crash_dump (secs=<optimized out>) at sys/unix/sys.c:780

因此,它似乎在尝试编写故障转储时崩溃了,但并没有完全成功。我做了一些研究,听起来很像之前发布的问题(https://groups.google.com/forum/#!msg/erlang-programming/XH2Uly6hsLY/aeR2Yx2UkZMJ)。 Heart 未在命令行上启用,这意味着这不应该是问题,但是......在核心转储中,heart_port 设置为非空值。这应该意味着心脏潜伏在某个地方,不是吗?如果是这样,有没有办法告诉heart 真的没有跑?

【问题讨论】:

  • 您是否尝试将 ERL_CRASH_DUMP_SECONDS 环境变量设置为较高的值?还是-1?
  • 是的,忘了说。我将它设置为 300,这似乎应该足够长了。

标签: erlang crash-dumps erlang-heart


【解决方案1】:

这是 erlang VM 崩溃,而不是 erlang 进程崩溃,因此没有生成 erl_crash.dump。根据我的经验,我怀疑它不是 prepare_crash_dump 的核心,而是您将错误的二进制文件加载到 gdb 中。如果您没有在崩溃的系统上进行调试,则应该将 erlang 二进制文件复制下来并将 GDB 指向它们。

【讨论】:

    【解决方案2】:

    在 erts 8.0 中,您有:确保在内存不足时创建故障转储。这在 erts-7.3 版本中被意外删除。

    因此,如果您的虚拟机受到此错误的影响并且由于这个原因而崩溃,它不会生成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-20
      • 1970-01-01
      • 1970-01-01
      • 2014-10-30
      • 2011-02-16
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      相关资源
      最近更新 更多