Не удается запустить образец erlang, сгенерированный с помощью арматуры
Я новичок в арматуре и эрланге. Я пытался создать релиз erlang с арматурой согласно этому руководству: http://www.metabrew.com/article/erlang-rebar-tutorial-generating-releases-upgrades и застрял в точке запуска сгенерированного выпуска.
Моя система - Ubuntu 11.04 64bit, erlang R14B03, установленная из источников.
Когда я вызываю "bin/somenode console", я получаю одну из следующих ошибок:
Exec: /home/ghik/Inz/somerel/rel/somenode/erts-5.8.4/bin/erlexec -boot /home/ghik/Inz/somerel/rel/somenode/releases/1/somenode -mode embedded -config /home/ghik/Inz/somerel/rel/somenode/etc/app.config -args_file /home/ghik/Inz/somerel/rel/somenode/etc/vm.args -- console
Root: /home/ghik/Inz/somerel/rel/somenode
{"init terminating in do_boot",{'cannot load',hipe_amd64_encode,get_files}}
Crash dump was written to: erl_crash.dump
init terminating in do_boot ()
Интересно, что каждый раз, когда я запускаю его, вместо "hipe_amd64_encode" указывается другой атом, например: "hipe_amd64_defuse", "hipe_amd64_assemble" и т.д.
Я предполагаю, что erlang не может загрузить hipe, но я понятия не имею, почему он пытается загрузить его в первую очередь. Релиз содержит только одно, очень простое приложение, зависящее только от ядра и stdlib.
По какой-то причине арматура генерирует файл .rel с множеством ненужных приложений:
%% rel generated at {2011,9,6} {20,5,48}
{release,{"somenode","1"},
{erts,"5.8.4"},
[{kernel,"2.14.4"},
{stdlib,"1.17.4"},
{sasl,"2.1.9.4"},
{someapp,"1"},
{compiler,"4.7.4",load},
{crypto,"2.0.3",load},
{et,"1.4.3",load},
{gs,"1.5.13",load},
{hipe,"3.8",load},
{inets,"5.6",load},
{mnesia,"4.4.19",load},
{observer,"0.9.9",load},
{public_key,"0.12",load},
{runtime_tools,"1.8.5",load},
{ssl,"4.1.5",load},
{syntax_tools,"1.6.7.1",load},
{tools,"2.6.6.4",load},
{webtool,"0.8.8",load},
{wx,"0.98.10",load}]}.
Почему список арматурных панелей содержит множество приложений в файле .rel? И если это хорошо, почему релиз не начинается?
Ответы
Ответ 1
Прежде всего, вы можете попытаться увидеть, что не удается во время загрузки виртуальной машины, добавив аргументы init_debug
в виртуальную машину:
$ erl -init_debug
{progress,preloaded}
{progress,kernel_load_completed}
{progress,modules_loaded}
{start,heart}
{start,error_logger}
{start,application_controller}
{progress,init_kernel_started}
...
{progress,applications_loaded}
{apply,{application,start_boot,[kernel,permanent]}}
{apply,{application,start_boot,[stdlib,permanent]}}
{apply,{c,erlangrc,[]}}
{progress,started}
Erlang R14B03 (erts-5.8.4) [source] [64-bit] [smp:4:4] [rq:4] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.8.4 (abort with ^G)
1>
Используя это, вы сможете увидеть более подробные сведения о взаимодействии. Возможно, библиотеки загружаются в неправильном порядке, вы не поддерживаете native и т.д.
Вторая проблема - файл rel, содержащий слишком много приложений. Вероятно, это связано с тем, что Rebar использует Reltool для генерации выпусков и что различные приложения могут загружаться в зависимости от того, насколько гранулирован элемент управления, который генерирует релизы (см. incl_cond
материал в документах). Есть несколько примеров для этого в Release the The Word глава Learn You Some Erlang:
{sys, [
{lib_dirs, ["/home/ferd/code/learn-you-some-erlang/release/"]},
{erts, [{mod_cond, derived}, % derived makes it pick less stuff
{app_file, strip}]},
{rel, "erlcount", "1.0.0", [kernel, stdlib, ppool, erlcount]},
{boot_rel, "erlcount"},
{relocatable, true},
{profile, embedded}, % reduces the files included from each app
{app_file, strip}, % reduces the size of app files if possible
{incl_cond, exclude}, % by default, don't include apps. 'derived' is another option
{app, stdlib, [{mod_cond, derived}, {incl_cond, include}]}, % include at the app
{app, kernel, [{incl_cond, include}]}, % level overrides the
{app, ppool, [{vsn, "1.0.0"}, {incl_cond, include}]}, % exclude put earlier
{app, erlcount, [{vsn, "1.0.0"}, {incl_cond, include}]}
]}.
И это должно генерировать меньшие релизы.
Ответ 2
Добавьте в reltool.config
следующую строку:
{app, hipe, [{incl_cond, exclude}]}
Ответ 3
Я не знаю хорошего ответа, но я знаю, что я не мог запустить выпуск на нескольких версиях CentOS с несколькими разными ядрами, так что это не совсем необычно. Модернизация до 5.6 сделала его окончательно работающим. Вы можете увидеть, какие ОС фактически проходят тестирование каждый день здесь:
http://www.erlang.org/doc/installation_guide/INSTALL.html#id62915
Кроме того, вы можете компилировать без HIPE, я думаю.
Ответ 4
В последнее время я нашел этот пост:
http://mokele.co.uk/2011/07/01/rebar-release-upgrade-caveats.html
Он раскрывает список ошибок в арматуре, одна из которых является причиной, по которой мой выпуск не запускался. Также опубликованы исправления. Я надеюсь, что они будут объединены в основной репозиторий арматуры ASAP.