我有ejabberd 13.12,一切都很好,直到我将服务器机器移动到另一个网络,然后jabber服务器开始计算崩溃。 (网络的类型和细节相同)
CRASH REPORT Process <0.4260.0> with 0 neighbours exited with reason: call to undefined function
ejabberd_socket:get_conn_type({socket_state,gen_tcp,#Port<0.5852>,<0.4259.0>}) in p1_fsm:terminate/7 line 733
2014-01-23 09:34:42.548 [error] <0.330.0> Supervisor ejabberd_c2s_sup had child undefined started with
{ejabberd_c2s,start_link,undefined} at <0.4260.0> exit with reason call to undefined function
ejabberd_socket:get_conn_type({socket_state,gen_tcp,#Port<0.5852>,<0.4259.0>}) in context child_terminated
在机器迁移后,用户的状态随机更改。
我尝试重新安装jabber服务器,并且我使用了从头开始编译的ejabberd 2.1.13 - 使用jabber时出现了同样的错误。
功能是:
get_conn_type(StateData) ->
case (StateData#state.sockmod):get_sockmod(StateData#state.socket) of
gen_tcp -> c2s;
p1_tls -> c2s_tls;
ezlib ->
case ezlib:get_sockmod((StateData#state.socket)#socket_state.socket) of
gen_tcp -> c2s_compressed;
p1_tls -> c2s_compressed_tls
end;
ejabberd_http_poll -> http_poll;
ejabberd_http_bind -> http_bind;
_ -> unknown
end.
我想要理解这个函数(好的pythoner,从不erlang)并添加hack或查明问题:是sth ejabberd特定的还是sth with socket(但其他网络工具/服务工作正常)。
a)如何向该函数插入交互式调试器,并在那里获得堆栈和变量的交互式内省。
答案 0 :(得分:0)
您看到的错误消息显示get_conn_type
模块中不存在ejabberd_socket
函数。这是真的;在标准的ejabberd发行版中,get_conn_type
存在于ejabberd_c2s
模块中。
如果你肯定你和其他任何人都没有修改过这些来源,那么我会检查你的Erlang安装。也许它已经坏了,或者你正在使用不同的版本来编译和运行代码。