2010-01-17 3 views
0

Когда я запускаю функцию внутри оболочки erl, она работает нормально. Когда я пытаюсь вызвать ту же функцию с помощью функции модуля erl ... -s, она терпит неудачу.Erlang VM -s аргумент misbehaving

Строка кода, который в конечном счете терпит неудачу является:

start(Port) -> 
    mochiweb_http:start([{port, Port}, {loop, fun dispatch_requests/1}]). 

Я уверен, что порт установлен правильно. Мое сообщение об ошибке:

=CRASH REPORT==== 17-Jan-2010::00:21:09 === 
    crasher: 
    initial call: mochiweb_socket_server:acceptor_loop/1 
    pid: <0.65.0> 
    registered_name: [] 
    exception exit: {error,closed} 
     in function mochiweb_socket_server:acceptor_loop/1 
    ancestors: [mochiweb_http,<0.1.0>] 
    messages: [] 
    links: [] 
    dictionary: [] 
    trap_exit: false 
    status: running 
    heap_size: 377 
    stack_size: 24 
    reductions: 93 
    neighbours: 

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

Любая помощь очень ценится.

+0

Вы можете вставить в минимальном код, который воспроизводит эту ошибку? – Zed

+0

Zed: http://pastie.org/781981 – Eli

+0

Работает отлично для меня. – Zed

ответ

1

Хм, я думаю, что это должно сработать. Все модули скомпилированы с той же версией компилятора? IIRC могут быть странные ошибки на уровне сокета, если нет. Кстати, вы можете вызвать начало функции точки входа, которая по умолчанию используется для -s.

+0

andi5: как я могу проверить версию компилятора на каждом? – Eli

+0

proplists: get_value (версия, Mod: module_info (компиляция)). должен показать его для модуля Mod. Используя списки: foreach/2 и code: all_loaded(), вы можете перебирать список всех загруженных модулей. – andi5

+0

Все кажется либо неопределенным, либо 4.6.3. Ознакомьтесь с http://pastie.org/782757. Кроме того, это тоже не удается, которое использует начало в качестве точки входа: http://pastie.org/782752 – Eli

0

При использовании -s аргументы собираются в список, поэтому порт фактически будет заключен в список. вы можете проверить оба случая (список или int) с помощью функции обертки (например, start([Port])).

+0

У меня на самом деле была обертка. Я на самом деле вызываю start_all/0, который вызывает начало. Моя команда: erl -boot start_sasl -s server_util start_all – Eli

0

Когда вы используете -s для запуска функций Erlang, аргументы помещаются в список атомов. Когда вы используете -run для запуска функций Erlang, аргументы помещаются в список из строк.

Если вам нужно указать значение целого числа, вам необходимо будет сделать правильные преобразования. Если вы хотите, чтобы охватить все случаи, что-то вроде этого может помочь:

start([Port]) when is_atom(Port) -> 
    start([atom_to_list(Port)]); 
start([Port]) when is_list(Port) -> 
    start(list_to_integer(Port)); 
start(Port) when is_integer(Port) -> 
    mochiweb_http:start([{port, Port}, {loop, fun dispatch_requests/1}]). 

Обратитесь к справочной странице для Эрл («Эрл -man Эрл») для деталей.

+0

Спасибо за детали. Однако мне следовало бы отредактировать мой вопрос, потому что я на самом деле вызываю start/0, который вызывает start/1 с моим портом по умолчанию. Я начал удалять вещи и в конечном итоге упростил свою проблему: http://pastie.org/782752 - это работает для вас? Это не удается для меня на OS X. Есть идеи? Очень признателен. – Eli

+0

Ну, забава «петли» - это не петля. Я не знаком с mochiweb, поэтому не могу сказать, что это ваша проблема. Во всяком случае, эта паста выглядит для меня совершенно отдельной проблемой, например, для правильного использования API mochiweb, а не для запуска «erl -s». Вероятно, лучше открыть новый вопрос с этой новой проблемой. – ndim

+0

ndim: но он отлично работает, когда я вызываю его из консоли erl. Кроме того, исправление его в реальном цикле не помогает: http://pastie.org/788592. Проблема в том, что gen_tcp: listen почему-то возвращает {error, closed}. – Eli

1

В качестве альтернативы вы можете попробовать -eval вариант:

erl -eval 'module:start(9090).'