Erlang:没有崩溃转储

时间:2013-11-11 16:09:45

标签: erlang crash-dumps erlang-heart

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

在erts 8.0中,你有:确保在内存不足时创建崩溃转储。这在erts-7.3版本中意外删除了。

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