erlang - Informe de error de un proceso terminado(se espera que sea normal)
eunit (1)
Tengo un módulo de prueba que prueba mi módulo de Table
. Table
módulo My Table
, cuando termina, lo llama así:
terminate(_, State = {Board, Status, Players}) ->
gen_server:stop(Board),
...stopping other processes,
io:format("Table Terminating.~p~n", [State]),
ok.
Esta es la única parte de mi código que detendría un proceso de la Board
.
Después de ejecutar mis pruebas, obtendré esto después de aproximadamente un minuto:
=ERROR REPORT==== 21-Jul-2017::22:28:40 ===
** Generic server <0.92.0> terminating
** Last message in was []
** When Server state == [[{spawn,x,none},
{recent,x,none},
{empty,null,none},
{empty,null,none},
{empty,null,none}],
[{empty,null,none},
{empty,null,none},
{empty,null,none},
{ridge,null,none},
{empty,null,none}],
[{empty,null,none},
{empty,null,none},
{ridge,null,none},
{empty,null,none},
{empty,null,none}],
[{empty,null,none},
{ridge,null,none},
{empty,null,none},
{empty,null,none},
{empty,null,none}],
[{empty,null,none},
{empty,null,none},
{empty,null,none},
{empty,null,none},
{spawn,o,none}]]
** Reason for termination ==
** {terminated,[{io,format,
[<0.90.0>,"Board.~p~n",
[[[{spawn,x,none},
{recent,x,none},
{empty,null,none},
{empty,null,none},
{empty,null,none}],
[{empty,null,none},
{empty,null,none},
{empty,null,none},
{ridge,null,none},
{empty,null,none}],
[{empty,null,none},
{empty,null,none},
{ridge,null,none},
{empty,null,none},
{empty,null,none}],
[{empty,null,none},
{ridge,null,none},
{empty,null,none},
{empty,null,none},
{empty,null,none}],
[{empty,null,none},
{empty,null,none},
{empty,null,none},
{empty,null,none},
{spawn,o,none}]]]],
[]},
{board,terminate,2,[{file,"board.erl"},{line,319}]},
{gen_server,try_terminate,3,
[{file,"gen_server.erl"},{line,629}]},
{gen_server,terminate,7,[{file,"gen_server.erl"},{line,795}]},
{proc_lib,init_p_do_apply,3,
[{file,"proc_lib.erl"},{line,247}]}]
que parece que el módulo de la Board
terminó incorrectamente. La terminación de la Board
es tal:
terminate(normal, State) ->
io:format("Board.~p~n", [State]),
ok.
Traté de reproducir esto en un módulo independiente, b
:
-module(b).
-compile(export_all).
init([]) -> {ok, {1, 2}}.
terminate(_, State) ->
io:format("Table Terminating.~p~n", [State]),
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
handle_cast(_, State) ->
{noreply, State}.
handle_info(Msg, State) ->
io:format("Unexpected message: ~p~n",[Msg]),
{noreply, State}.
go() ->
gen_server:start_link(?MODULE, [], []).
Sin éxito:
4> {ok, B} = b:go(). {ok,<0.74.0>} 5> gen_server:stop(B). Table Terminating.{1,2}
Lo que me pregunto es, ¿qué tipo de código debería buscar para que mi Junta obtenga la ** Reason for termination == ** {terminated
razón por la cual se suspendió?
La fuente completa está aquí: [email protected]: QuantumProductions / tunnel.git
Editar: el tablero incluye esto
handle_call(stop, _From, State) ->
{stop, normal, shutdown_ok, State};
handle_call(_, _, Board) ->
{reply, {error, unrecognized, Board}, Board}.
EDITAR: Mi mejor estimación es eunit
se terminan automáticamente los procesos creados dentro de sus pruebas?
¿Por qué borad
último mensaje es []
? De acuerdo con el código que utilizó gen_server:stop/1
que llama a gen:stop/1
que llama a gen:stop/3
que llama a proc_lib:stop/3
que finalmente llama a sys:terminate/3
. Cuando llamas a sys:terminate/3
para gen_server, sys llama gen_server:system_terminate/4
y llama a gen_server:terminate/6
con []
como último mensaje!
¿por qué borad
terminó con razón {terminated, ...}
? De acuerdo con el código io
, io:format/2
finalmente llama a io:execute_request/2
y lo obtuvo porque el proceso io finalizó y aquí se convierte en {terminated, ...}
.