我正在运行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值。这应该意味着心脏潜伏在某个地方,不应该吗?如果是这样,有没有办法告诉人们真的不能运行?
答案 0 :(得分:1)
这是erlang VM崩溃,而不是erlang进程崩溃,所以没有生成erl_crash.dump。根据我的经验,我怀疑它在prepare_crash_dump中没有核心,但是你有错误的二进制文件加载到gdb中。如果您没有在崩溃的系统上进行调试,则应该将erlang二进制文件复制下来并将GDB指向它们。
答案 1 :(得分:0)
在erts 8.0中,你有:确保在内存不足时创建崩溃转储。这在erts-7.3版本中意外删除了。
因此,如果你的虚拟机受到这个bug的影响,并且由于这个原因而崩溃,它就不会生成。