2017-07-22 2 views
1

J'ai un module de test qui teste mon module Table. module Mon Table, quand il se termine, appelle ceci:Rapport d'erreur provenant d'un processus terminé (devrait être normal)

terminate(_, State = {Board, Status, Players}) -> 
    gen_server:stop(Board), 
    ...stopping other processes, 
    io:format("Table Terminating.~p~n", [State]), 
    ok. 

Ceci est la seule partie de mon code qui arrêterait un processus Board.

Après l'exécution de mes tests, je vais faire cela après environ une minute:

=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}]}] 

qui ressemble le module Board terminé de manière incorrecte. Le Board « s terminate est tel:

terminate(normal, State) -> 
    io:format("Board.~p~n", [State]), 
    ok. 

J'ai essayé de reproduire ce dans un module autonome, 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, [], []). 

Sans succès:

4> {ok, B} = b:go(). {ok,<0.74.0>} 5> gen_server:stop(B). Table Terminating.{1,2}

Ce que je me demande est , quel type de code devrais-je rechercher pour que mon Conseil obtienne le ** Reason for termination == ** {terminated motif de l'arrêt?

source complet est ici: [email protected]: QuantumProductions/tunnel.git

Edit: Conseil comprend ce

handle_call(stop, _From, State) -> 
    {stop, normal, shutdown_ok, State}; 
handle_call(_, _, Board) -> 
    {reply, {error, unrecognized, Board}, Board}. 

EDIT: Ma meilleure estimation est eunit se termine automatiquement les processus créés dans son tests?

Répondre

0

Pourquoi borad dernier message est []? Selon le code que vous avez utilisé gen_server:stop/1 qui appelle gen:stop/1 qui appelle gen:stop/3 qui appelle proc_lib:stop/3 qui appelle finalement sys:terminate/3. Lorsque vous appelez sys:terminate/3 pour un serveur_gen, sys appelle gen_server:system_terminate/4 et appelle gen_server:terminate/6 avec [] comme dernier message!

pourquoi borad terminé avec raison {terminated, ...}? Selon le code io, io:format/2 appelle enfin io:execute_request/2 et vous avez this parce que io processus terminé et dans here il devient {terminated, ...}.

+0

Alors comment terminer mon processus sans erreur? – quantumpotato

+0

Je suppose que vous avez perdu le processus io juste dans les tests Eunit et je recommande d'utiliser le débogage sys standard à la place de io: format. http://erlang.org/doc/design_principles/spec_proc.html#debug – Pouriya

+0

Est-ce que Eunit dit au processus de se terminer alors? Quand vous dites "processus perdu" - vous voulez dire que Eunit l'a tué? – quantumpotato