gamexg hzly
unread,May 26, 2012, 10:59:58 PM5/26/12Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Sign in to report message
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to ec...@googlegroups.com, erlang...@googlegroups.com
新人学习 erlang ,建了一个简单的 k-v gen_server ,用supervisor 启动它,结果 gen_server
出错重启后,调用 gen_server 提示exception exit:
{noproc,{gen_server,call,[gs1,{g,a}]}}。
看记录显示 gen_server 已经重启了啊,而且没有重启失败的提示。
请问是什么原因造成重启后的 gen_server 调用失败啊?
错误:
Eshell V5.9.1 (abort with ^G)
1> code:add_patha("D:\\Dropbox\\eclipse\\workspace\\test1\\src").
true
2> sup1:start().
sup1 init...
init...
{ok,<0.34.0>}
3> gs1:s(a,1).
ok
4> gs1:g(a).
{ok,1}
5> gs1:k(). %% 使 gen_server 出错
init...
=ERROR REPORT==== 27-May-2012::10:15:10 ===
** Generic server gs1 terminating
** Last message in was k
** When Server state == {state,{dict,1,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],[],
[],[],[]},
{{[],
[[a|1]],
[],[],[],[],[],[],[],[],[],[],[],[],[],
[]}}}}
** Reason for termination ==
** {badarith,[{gs1,handle_call,3,
[{file,"d:/Dropbox/eclipse/WORKSP~1/test1/src/gs1.erl"},
{line,81}]},
{gen_server,handle_msg,5,[{file,"gen_server.erl"},{line,588}]},
{proc_lib,init_p_do_apply,3,
[{file,"proc_lib.erl"},{line,227}]}]}
=ERROR REPORT==== 27-May-2012::10:15:10 ===
** Generic server sup1 terminating
** Last message in was {'EXIT',<0.31.0>,
{{{badarith,
[{gs1,handle_call,3,
[{file,
"d:/Dropbox/eclipse/WORKSP~1/test1/src/gs1.erl"},
{line,81}]},
{gen_server,handle_msg,5,
[{file,"gen_server.erl"},{line,588}]},
{proc_lib,init_p_do_apply,3,
[{file,"proc_lib.erl"},{line,227}]}]},
{gen_server,call,[gs1,k]}},
[{gen_server,call,2,
[{file,"gen_server.erl"},{line,180}]},
{erl_eval,do_apply,6,
[{file,"erl_eval.erl"},{line,576}]},
{shell,exprs,7,[{file,"shell.erl"},{line,668}]},
{shell,eval_exprs,7,[{file,"shell.erl"},{line,623}]},
{shell,eval_loop,3,
[{file,"shell.erl"},{line,608}]}]}}
** When Server state == {state,
{local,sup1},
one_for_one,
[{child,<0.39.0>,jisuan,
{gs1,start,[]},
permanent,500,worker,
[gs1]}],
undefined,3,10,
[{1338,84910,186000}],
sup1,[]}
** Reason for termination ==
** {{{badarith,[{gs1,handle_call,3,
[{file,"d:/Dropbox/eclipse/WORKSP~1/test1/src/gs1.erl"},
{line,81}]},
{gen_server,handle_msg,5,[{file,"gen_server.erl"},{line,588}]},
{proc_lib,init_p_do_apply,3,
[{file,"proc_lib.erl"},{line,227}]}]},
{gen_server,call,[gs1,k]}},
[{gen_server,call,2,[{file,"gen_server.erl"},{line,180}]},
{erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,576}]},
{shell,exprs,7,[{file,"shell.erl"},{line,668}]},
{shell,eval_exprs,7,[{file,"shell.erl"},{line,623}]},
{shell,eval_loop,3,[{file,"shell.erl"},{line,608}]}]}
** exception exit: {{badarith,
[{gs1,handle_call,3,
[{file,
"d:/Dropbox/eclipse/WORKSP~1/test1/src/gs1.erl"},
{line,81}]},
{gen_server,handle_msg,5,
[{file,"gen_server.erl"},{line,588}]},
{proc_lib,init_p_do_apply,3,
[{file,"proc_lib.erl"},{line,227}]}]},
{gen_server,call,[gs1,k]}}
in function gen_server:call/2 (gen_server.erl, line 180)
6> gs1:g(a).
** exception exit: {noproc,{gen_server,call,[gs1,{g,a}]}}
in function gen_server:call/2 (gen_server.erl, line 180)
附:
gs1.erl
%%% -------------------------------------------------------------------
%%% Author : Administrator
%%% Description :
%%%
%%% Created : 2012-5-24
%%% -------------------------------------------------------------------
-module(gs1).
-behaviour(gen_server).
%% --------------------------------------------------------------------
%% Include files
%% --------------------------------------------------------------------
%% --------------------------------------------------------------------
%% External exports
-export([start/0, s/2, g/1, k/0, stop/0]).
%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
-record(state, {data}).
%% ====================================================================
%% External functions
%% ====================================================================
start()->
gen_server:start_link({local,?MODULE},?MODULE, [], []).
stop()->
gen_server:cast(?MODULE, stop).
s(Key,Value)->
gen_server:call(?MODULE, {s,Key,Value}).
g(Key)->
gen_server:call(?MODULE, {g,Key}).
k()->
gen_server:call(?MODULE, k).
%% ====================================================================
%% Server functions
%% ====================================================================
%% --------------------------------------------------------------------
%% Function: init/1
%% Description: Initiates the server
%% Returns: {ok, State} |
%% {ok, State, Timeout} |
%% ignore |
%% {stop, Reason}
%% --------------------------------------------------------------------
init([]) ->
io:format("init...~n"),
{ok, #state{data = dict:new()}}.
%% --------------------------------------------------------------------
%% Function: handle_call/3
%% Description: Handling call messages
%% Returns: {reply, Reply, State} |
%% {reply, Reply, State, Timeout} |
%% {noreply, State} |
%% {noreply, State, Timeout} |
%% {stop, Reason, Reply, State} | (terminate/2 is called)
%% {stop, Reason, State} (terminate/2 is called)
%% --------------------------------------------------------------------
handle_call({s,Key,Value}, From, State) ->
NState = State#state{data=dict:store(Key, Value, State#state.data)},
Reply = ok,
{reply, Reply, NState};
handle_call({g,Key}, From, State) ->
Reply = dict:find(Key, State#state.data),
{reply, Reply, State};
handle_call(k, From, State) ->
0/0,
{reply, 0, State}.
%% --------------------------------------------------------------------
%% Function: handle_cast/2
%% Description: Handling cast messages
%% Returns: {noreply, State} |
%% {noreply, State, Timeout} |
%% {stop, Reason, State} (terminate/2 is called)
%% --------------------------------------------------------------------
handle_cast(stop, State) ->
{stop, normal, State}.
%% --------------------------------------------------------------------
%% Function: handle_info/2
%% Description: Handling all non call/cast messages
%% Returns: {noreply, State} |
%% {noreply, State, Timeout} |
%% {stop, Reason, State} (terminate/2 is called)
%% --------------------------------------------------------------------
handle_info(Info, State) ->
{noreply, State}.
%% --------------------------------------------------------------------
%% Function: terminate/2
%% Description: Shutdown the server
%% Returns: any (ignored by gen_server)
%% --------------------------------------------------------------------
terminate(Reason, State) ->
ok.
%% --------------------------------------------------------------------
%% Func: code_change/3
%% Purpose: Convert process state when code is changed
%% Returns: {ok, NewState}
%% --------------------------------------------------------------------
code_change(OldVsn, State, Extra) ->
{ok, State}.
%% --------------------------------------------------------------------
%%% Internal functions
%% --------------------------------------------------------------------
sup1.erl:
%%% -------------------------------------------------------------------
%%% Author : Administrator
%%% Description :
%%%
%%% Created : 2012-5-25
%%% -------------------------------------------------------------------
-module(sup1).
-behaviour(supervisor).
%% --------------------------------------------------------------------
%% Include files
%% --------------------------------------------------------------------
%% --------------------------------------------------------------------
%% External exports
%% --------------------------------------------------------------------
-export([start/0]).
%% --------------------------------------------------------------------
%% Internal exports
%% --------------------------------------------------------------------
-export([
init/1
]).
%% --------------------------------------------------------------------
%% Macros
%% --------------------------------------------------------------------
-define(SERVER, ?MODULE).
%% --------------------------------------------------------------------
%% Records
%% --------------------------------------------------------------------
%% ====================================================================
%% External functions
%% ====================================================================
start()->
supervisor:start_link({local,?MODULE}, ?MODULE, []).
%% ====================================================================
%% Server functions
%% ====================================================================
%% --------------------------------------------------------------------
%% Func: init/1
%% Returns: {ok, {SupFlags, [ChildSpec]}} |
%% ignore |
%% {error, Reason}
%% --------------------------------------------------------------------
init([]) ->
io:format("sup1 init...~n"),
AChild = {jisuan,{gs1,start,[]},
permanent,500,worker,[gs1]},
{ok,{{one_for_one,3,10}, [AChild]}}.
%% ====================================================================
%% Internal functions
%% ====================================================================