2

我正在运行 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 设置为非空值。这应该意味着心脏潜伏在某个地方,不是吗?如果是这样,有没有办法告诉心脏真的不要跑?

4

2 回答 2

1

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

于 2014-04-18T11:06:40.683 回答
0

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

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

于 2016-09-16T14:18:39.263 回答