2011-09-06 4 views
11

Ogólnie jestem początkującym z prętami zbrojeniowymi i erlang. Próbowałem stworzyć wydanie erlang z prętami zbrojeniowymi zgodnie z tym tutorialem: http://www.metabrew.com/article/erlang-rebar-tutorial-generating-releases-upgrades i utknąłem w momencie uruchomienia wygenerowanego wydania.Nie można uruchomić przykładowego wydania erlang wygenerowanego za pomocą pręta zbrojeniowego

Mój system to Ubuntu 11.04 64bit, erlang R14B03, zainstalowany ze źródeł.

gdy jestem wywoływanie „konsolę bin/somenode”, mam jeden z następujących błędów:

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() 

Co ciekawe, za każdym razem kiedy go uruchomić, inny atom znajduje się na liście zamiast „hipe_amd64_encode” dla przykład: 'hipe_amd64_defuse', 'hipe_amd64_assemble', itp. Zgaduję, że erlang nie jest w stanie załadować hipe, ale nie mam pojęcia, dlaczego próbuje go wczytać. Wersja zawiera tylko jedną, bardzo prostą aplikację zależną tylko od jądra i stdlib.

Z jakiegoś powodu, zbrojenie generuje plik .rel z dużą ilością niepotrzebnych aplikacji:

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

Dlaczego lista prętów zbrojeniowych Soo wiele aplikacji w pliku .rel? A jeśli wszystko jest w porządku, dlaczego nie rozpocznie się wydanie?

Odpowiedz

9

Przede wszystkim, można spróbować zobaczyć, co ulegnie awarii podczas uruchamiania VM dodając argumenty init_debug do VM:

$ 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> 

Używanie tego, będziesz w stanie zobaczyć więcej szczegółów rodzaj interakcji. Może się okazać, że biblioteki są ładowane w niewłaściwej kolejności, nie wspierać rodzimy itp


Drugi problem, plik rel zawierającego zbyt wiele aplikacji. Jest to prawdopodobnie spowodowane faktem, że Rebar używa Reltool generować wydania, i że różne aplikacje mogą być ładowane w zależności od tego, jak ziarnisty jest formant generujący wydania (zobacz incl_cond materiał w dokumentach). Istnieje kilka przykładów na to w Release is The Word rozdziale Dowiedz Ci kilka 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}]} 
]}. 

I to powinno generować mniejsze wersje.

+5

Właśnie dodałem {app, HIPE, [{incl_cond wykluczyć}]}, aby reltool.config i działa do teraz. Dzięki za pomoc. – ghik

0

Nie znam dobrej odpowiedzi, ale wiem, że nie mogłem uruchomić wydania działającego w kilku wersjach CentOS z kilkoma różnymi jądrami, więc nie jest to coś niezwykłego. Aktualizacja do 5.6 sprawiła, że ​​w końcu zadziałało. Można zobaczyć, które rzeczywiście zrobić test systemów operacyjnych codziennie tutaj:

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

Ponadto, można skompilować bez HIPE, jak sądzę.

13

Dodaj do reltool.config, następujący wiersz:

{app, hipe, [{incl_cond, exclude}]} 
Powiązane problemy