Explorar el Código

Handle strange crash report from gen_statem

pull/473/head
Andrew Thompson hace 6 años
padre
commit
9bfc9bd20f
Se han modificado 3 ficheros con 26 adiciones y 8 borrados
  1. +3
    -0
      src/error_logger_lager_h.erl
  2. +15
    -2
      test/crash_statem.erl
  3. +8
    -6
      test/lager_test_backend.erl

+ 3
- 0
src/error_logger_lager_h.erl Ver fichero

@ -207,6 +207,9 @@ log_event(Event, #state{sink=Sink} = State) ->
[TName, _Msg, TStateName, _StateData, TReason] ->
{gen_fsm, TName, TStateName, TReason};
[TName, _Msg, {TStateName, _StateData}, _ExitType, TReason, _FsmType, Stacktrace] ->
{gen_statem, TName, TStateName, {TReason, Stacktrace}};
[TName, _Msg, [{TStateName, _StateData}], _ExitType, TReason, _FsmType, Stacktrace] ->
%% sometimes gen_statem wraps its statename/data in a list for some reason???
{gen_statem, TName, TStateName, {TReason, Stacktrace}}
end,
{Md, Formatted} = format_reason_md(Reason),

+ 15
- 2
test/crash_statem.erl Ver fichero

@ -6,6 +6,8 @@
-export([
start/0,
crash/0,
stop/1,
timeout/0,
handle_event/4
]).
@ -17,6 +19,12 @@ start() ->
crash() ->
gen_statem:call(?MODULE, boom).
stop(Reason) ->
gen_statem:call(?MODULE, {stop, Reason}).
timeout() ->
gen_statem:call(?MODULE, timeout).
%% Mandatory callback functions
terminate(_Reason, _State, _Data) -> ok.
code_change(_Vsn, State, Data, _Extra) -> {ok,State,Data}.
@ -26,12 +34,17 @@ init([]) ->
"8.0" -> {callback_mode(),state1,undefined};
_ -> {ok, state1, undefined}
end.
callback_mode() -> handle_event_function.
%%% state callback(s)
handle_event({call, _From}, state1, _Arg, Data) ->
{next_state, state1, Data}.
handle_event(state_timeout, timeout, state1, _) ->
{stop, timeout};
handle_event({call, _From}, timeout, _Arg, Data) ->
{keep_state_and_data, [{state_timeout, 0, timeout}]};
handle_event({call, _From}, {stop, Reason}, state1, Data) ->
{stop, Reason}.
-else.
-export([start/0, crash/0]).

+ 8
- 6
test/lager_test_backend.erl Ver fichero

@ -996,14 +996,14 @@ kill_crasher(RegName) ->
Pid -> exit(Pid, kill)
end.
spawn_fsm_crash(Module) ->
spawn(fun() -> Module:crash() end),
spawn_fsm_crash(Module, Function, Args) ->
spawn(fun() -> erlang:apply(Module, Function, Args) end),
timer:sleep(100),
_ = gen_event:which_handlers(error_logger),
ok.
crash_fsm_test_() ->
TestBody = fun(Name, FsmModule, Expected) ->
TestBody = fun(Name, FsmModule, FSMFunc, FSMArgs, Expected) ->
fun(Sink) ->
{Name,
fun() ->
@ -1011,7 +1011,7 @@ crash_fsm_test_() ->
{true, true} -> ok;
_ ->
Pid = whereis(FsmModule),
spawn_fsm_crash(FsmModule),
spawn_fsm_crash(FsmModule, FSMFunc, FSMArgs),
{Level, _, Msg, Metadata} = pop(Sink),
test_body(Expected, lists:flatten(Msg)),
?assertEqual(Pid, proplists:get_value(pid, Metadata)),
@ -1031,8 +1031,10 @@ crash_fsm_test_() ->
}
end,
TestBody("gen_fsm crash", crash_fsm, "gen_fsm crash_fsm in state state1 terminated with reason: call to undefined function crash_fsm:state1/3 from gen_fsm:handle_msg/"),
TestBody("gen_statem crash", crash_statem, "gen_statem crash_statem in state state1 terminated with reason: no function clause matching crash_statem:handle")
TestBody("gen_fsm crash", crash_fsm, crash, [], "gen_fsm crash_fsm in state state1 terminated with reason: call to undefined function crash_fsm:state1/3 from gen_fsm:handle_msg/"),
TestBody("gen_statem crash", crash_statem, crash, [], "gen_statem crash_statem in state state1 terminated with reason: no function clause matching crash_statem:handle"),
TestBody("gen_statem stop", crash_statem, stop, [explode], "gen_statem crash_statem in state state1 terminated with reason: explode"),
TestBody("gen_statem timeout", crash_statem, timeout, [], "gen_statem crash_statem in state state1 terminated with reason: timeout")
],
{"FSM crash output tests", [

Cargando…
Cancelar
Guardar