Erlang:聊天服务器在启动时崩溃

Erlang:聊天服务器在启动时崩溃,erlang,Erlang,我得到了一组程序应该通过的测试,所有的本地测试在我的服务器上都可以正常工作。当我试图运行远程测试时,服务器崩溃了 崩溃消息如下所示: =ERROR REPORT==== 23-Jul-2015::23:59:17 === Error in process <0.39.0> on node 'nodeS@127.0.0.1' with exit value: {undef,[{genserver,start,[server, {server_st,[],[]},#Fun<ser

我得到了一组程序应该通过的测试,所有的本地测试在我的服务器上都可以正常工作。当我试图运行远程测试时,服务器崩溃了

崩溃消息如下所示:

=ERROR REPORT==== 23-Jul-2015::23:59:17 === Error in process <0.39.0> on
node 'nodeS@127.0.0.1' with exit value: 
{undef,[{genserver,start,[server, {server_st,[],[]},#Fun<server.loop.2>],[]}]}
loop(St, {From, Nick, connection_wanted}) ->
    case lists:keymember(Nick, 2, St#server_st.users) of
        false -> {ok, St#server_st{users = St#server_st.users ++ [{From, Nick}]}};
        true -> {{user_already_connected, St}, St}
    end;
loop(St, {connect, {_Server, _Machine}}) ->
ServerPID = {list_to_atom(_Server), list_to_atom(_Machine)},
case genserver:request(ServerPID, {self(), St#cl_st.nick, connection_wanted}) of
    ok -> {ok, St#cl_st{connected_to = ServerPID}};
    _ -> {{error, user_already_connected, "A user with the nick " ++ St#cl_st.nick ++ "is already connected to" ++ _Server}, St}
end;
在记录中,“服务器”定义为:

-record(server_st, {users = [], channels = []}).
最后,genserver启动和循环功能是:

start(Name, State, F) ->
Pid = spawn(fun() -> loop(State, F) end),
register(Name, Pid),
Pid.

loop(State, F) ->
receive
{request, From, Ref, Data} ->
    case catch(F(State, Data)) of
    {'EXIT', Reason} ->
        From!{exit, Ref, Reason},
        loop(State, F);
    {R, NewState} ->
        From!{result, Ref, R},
        loop(NewState, F)
    end;
{update, From, Ref, NewF} ->
    From ! {ok, Ref},
    loop(State, NewF);
stop ->
    true
end.
那么genserver的功能我是不允许更改的。如果需要,我也可以发布整个测试套件

编辑 深入研究测试用例,我不确定是否是服务器导致了问题,我的远程连接功能如下所示:

=ERROR REPORT==== 23-Jul-2015::23:59:17 === Error in process <0.39.0> on
node 'nodeS@127.0.0.1' with exit value: 
{undef,[{genserver,start,[server, {server_st,[],[]},#Fun<server.loop.2>],[]}]}
loop(St, {From, Nick, connection_wanted}) ->
    case lists:keymember(Nick, 2, St#server_st.users) of
        false -> {ok, St#server_st{users = St#server_st.users ++ [{From, Nick}]}};
        true -> {{user_already_connected, St}, St}
    end;
loop(St, {connect, {_Server, _Machine}}) ->
ServerPID = {list_to_atom(_Server), list_to_atom(_Machine)},
case genserver:request(ServerPID, {self(), St#cl_st.nick, connection_wanted}) of
    ok -> {ok, St#cl_st{connected_to = ServerPID}};
    _ -> {{error, user_already_connected, "A user with the nick " ++ St#cl_st.nick ++ "is already connected to" ++ _Server}, St}
end;
编辑2 在testsuite中找到导致错误的特定行:

-define(HOST, '127.0.0.1').

new_client(Nick, GUIName) ->
ClientName = test_client:find_unique_name("client_"),
ClientAtom = list_to_atom(ClientName),

% Row below is causing the error
Result = slave:start(?HOST, ClientAtom),

assert_ok("start client node "++ClientName, element(1,Result)),
ClientNode = element(2,Result),

InitState = client:initial_state(Nick, GUIName),
Result2 = spawn(ClientNode, genserver, start, [ClientAtom, InitState, fun client:loop/2]),
assert("client startup "++ClientName, is_pid(Result2)),

{Nick, ClientAtom, ClientNode}.

您的函数
genserver:start/3
很可能未导出,或者模块
genserver
在运行调用它的代码的节点上不可用。

解决了它,它位于客户机与其他用户通信的完全无关的部分。仍然使用whereis命令从较旧版本的程序中查找其他用户。

错误
{unde,[{genserver,start,[server,{server_st,[],[],[],#Fun],[]}
?函数
genserver:start
未定义。您需要检查是否加载模块
genserver
?@BlackMamba-Hmm,我需要在哪个模块中检查?同样,通过加载,你的意思是如果包含了它?在你的erl shell中使用
genserver:module_info()。
@BlackMamba这不是我所能说的,但是所有其他测试套件都可以使用完全相同的genserver,只是远程测试对我不起作用。我还借用了一个friends实现,它可以很好地处理所有的测试套件,所以我很有信心问题出在我的服务器代码或客户机代码上。编辑:我在输入“genserver:module_info()”时收到的具体错误消息是:“异常错误:未定义的函数genserver:module_info/0”,您可以在erl shell中使用
nl(genserver)。
。它被导出,我的所有其他测试套件都与genserver一起工作,而不是我的远程测试套件。