Erlang: нет аварийного дампа

Я запускаю 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_port установлено ненулевое значение. Это должно означать, что где-то прячется сердце, не так ли? Если да, то есть ли способ заставить сердце на самом деле не работать?


person James Kingsbery    schedule 11.11.2013    source источник
comment
Вы пытались установить высокое значение для переменной env ERL_CRASH_DUMP_SECONDS? Или -1?   -  person Isac    schedule 12.11.2013
comment
Да, забыл упомянуть. Я установил его на 300, кажется, что этого должно хватить.   -  person James Kingsbery    schedule 12.11.2013


Ответы (2)


Это сбой виртуальной машины erlang, а не сбой процесса erlang, поэтому erl_crash.dump не создается. Исходя из моего опыта, я подозреваю, что это не ядро ​​в prepare_crash_dump, а что у вас есть неправильные двоичные файлы, загружаемые в gdb. Если вы не занимаетесь отладкой системы, в которой произошел сбой, вам следует скопировать двоичные файлы erlang и указать на них GDB.

person Jonathan Wiepert    schedule 18.04.2014

В erts 8.0 у вас есть: Не забудьте создать аварийный дамп при нехватке памяти. Это было случайно удалено в версии erts-7.3.

Поэтому, если ваша виртуальная машина подвержена этой ошибке и по этой причине происходит сбой, она не будет генерироваться.

person silviu    schedule 16.09.2016