Erlang VM -s Argument abgestürzten
Frage
Wenn ich eine Funktion innerhalb des erl Shell starten, es funktioniert gut. Wenn ich versuche, die gleiche Funktion mit erl aufzurufen ... -s Modulfunktion, versagt es.
Die Codezeile, die schließlich versagt ist:
start(Port) ->
mochiweb_http:start([{port, Port}, {loop, fun dispatch_requests/1}]).
Ich bin sicher, dass Port richtig eingestellt ist. Meine Fehlermeldung lautet:
=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:
habe ich versucht, den Debugger und es lässt mich Schritt für Schritt durch rechts, bis die Codezeile oben gegeben ist. Nachdem ich das passieren, es gibt mir diesen Crash-Bericht.
Jede Hilfe sehr geschätzt.
Lösung
Hm, ich denke, dass sollte funktionieren. Sind alle Module mit dem gleichen Compiler-Version kompiliert? IIRC es könnte seltsamen Fehler auf der Socket-Ebene sein, wenn es nicht. BTW, können Sie Ihre Eintrittspunktfunktion Start aufrufen, die der Standard für -s ist.
Andere Tipps
Alternativ können Sie die Option -eval
versuchen:
erl -eval 'module:start(9090).'
, wenn es verwendet, werden die Argumente in eine Liste gesammelt, so dass der Anschluss tatsächlich in einer Liste eingeschlossen werden würde. Sie können beide Fälle überprüfen (Liste oder int) mit einem Wrapper-Funktion (wie start([Port])
).
Wenn Sie sie verwenden Erlang Funktionen ausführen kann, werden die Argumente in eine Liste setzen von Atom . Wenn Sie -run verwenden Erlang Funktionen ausführen können, werden die Argumente in eine Liste setzen von Strings .
Wenn Sie einen müssen integer Wert auf weitergeben, müssen Sie die richtigen Conversions zu tun. Wenn Sie alle Fälle abdecken wollen, wie etwas, das könnte helfen:
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}]).
Lesen Sie die man-Seite für erl ( "erl -man erl") für Details.