Не удается запустить образец выпуска erlang, созданный с помощью rebar

StackOverflow https://stackoverflow.com/questions/7324556

  •  27-10-2019
  •  | 
  •  

Вопрос

Я новичок в арматуре и эрланге в целом.Я пытался создать версию erlang с помощью rebar в соответствии с этим руководством: http://www.metabrew.com/article/erlang-rebar-tutorial-generating-releases-upgrades и застрял на этапе запуска сгенерированного релиза.

Моя система - Ubuntu 11.04 64bit, erlang R14B03, установлена из исходных текстов.

Когда я вызываю "консоль bin / somenode", я получаю одну из следующих ошибок:

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', например, отображается другой atom:'hipe_amd64_defuse', 'hipe_amd64_assembly' и т.д.Я предполагаю, что erlang не может загрузить hipe, но я понятия не имею, почему is пытается загрузить его в первую очередь.Релиз содержит только одно, очень простое приложение, зависящее только от ядра и stdlib.

По какой-то причине rebar генерирует файл .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}]}.

Почему rebar перечисляет так много приложений в файле .rel?И даже если все в порядке, почему не запускается релиз?

Это было полезно?

Решение

Прежде всего, вы можете попытаться увидеть, что происходит сбой во время загрузки виртуальной машины, добавив аргументы 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 материал в документах).Для этого есть несколько примеров в Освобождение - это Слово глава из книги "Научи себя эрлангу":

{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}]}
]}.

И это должно привести к меньшим выпускам.

Другие советы

Добавить к reltool.config, следующая строка:

{app, hipe, [{incl_cond, exclude}]}

Я не знаю хорошего ответа, но я знаю, что я не смог запустить релиз, работающий на нескольких версиях CentOS с парой разных ядер, так что в этом нет ничего необычного.Обновление до версии 5.6 наконец-то заставило его работать.Здесь вы можете увидеть, какие операционные системы на самом деле тестируются каждый день:

http://www.erlang.org/doc/installation_guide/INSTALL.html#id62915

Кроме того, я думаю, вы могли бы скомпилировать без HIPE.

Недавно я нашел этот пост:http://mokele.co.uk/2011/07/01/rebar-release-upgrade-caveats.html

Он раскрывает список ошибок в rebar, одна из которых является причиной, по которой не удалось запустить мой релиз.Также опубликованы исправления.Я надеюсь, что они будут объединены в основное хранилище арматуры как можно скорее.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top