diff --git a/src/error_logger_lager_h.erl b/src/error_logger_lager_h.erl index a16bfe2b..3c86299f 100644 --- a/src/error_logger_lager_h.erl +++ b/src/error_logger_lager_h.erl @@ -159,9 +159,15 @@ format_crash_report(Report, Neighbours) -> proplists:get_value(pid, Report); Atom -> Atom end, - {_Class, Reason, _Trace} = proplists:get_value(error_info, Report), + {_Class, Reason, Trace} = proplists:get_value(error_info, Report), + ReasonStr = case is_atom(Reason) of + true -> + format_reason({Reason, Trace}); + _ -> + format_reason(Reason) + end, io_lib:format("Process ~w with ~w neighbours crashed with reason: ~s", - [Name, length(Neighbours), format_reason(Reason)]). + [Name, length(Neighbours), ReasonStr]). format_offender(Off) -> case proplists:get_value(mfargs, Off) of diff --git a/test/lager_test_backend.erl b/test/lager_test_backend.erl index e43d1e69..55b80061 100644 --- a/test/lager_test_backend.erl +++ b/test/lager_test_backend.erl @@ -685,6 +685,19 @@ error_logger_redirect_test_() -> ?assert(length(lists:flatten(Msg)) < 650) end }, + {"crash reports for 'special processes' should be handled right", + fun() -> + {ok, Pid} = special_process:start(), + unlink(Pid), + Pid ! function_clause, + timer:sleep(500), + _ = gen_event:which_handlers(error_logger), + {_, _, Msg} = pop(), + Expected = lists:flatten(io_lib:format("[error] ~p CRASH REPORT Process ~p with 0 neighbours crashed with reason: no function clause matching special_process:foo(bar)", + [Pid, Pid])), + ?assertEqual(Expected, lists:flatten(Msg)) + end + }, {"messages should not be generated if they don't satisfy the threshold", fun() -> lager:set_loglevel(?MODULE, error), diff --git a/test/special_process.erl b/test/special_process.erl new file mode 100644 index 00000000..831b9506 --- /dev/null +++ b/test/special_process.erl @@ -0,0 +1,28 @@ +-module(special_process). +-export([start/0, init/1]). + +start() -> + proc_lib:start_link(?MODULE, init, [self()]). + +init(Parent) -> + proc_lib:init_ack(Parent, {ok, self()}), + loop(). + +loop() -> + receive + function_clause -> + foo(bar), + loop(); + exit -> + exit(byebye), + loop(); + error -> + erlang:error(mybad), + loop(); + _ -> + loop() + end. + +foo(baz) -> + ok. +