diff --git a/src/error_logger_lager_h.erl b/src/error_logger_lager_h.erl index 170ebe5..4456cb0 100644 --- a/src/error_logger_lager_h.erl +++ b/src/error_logger_lager_h.erl @@ -274,6 +274,9 @@ format_mfa({M, F, A, Props}) when is_list(Props) -> Line -> [format_mfa({M, F, A}), io_lib:format(" line ~w", [Line])] end; +format_mfa([{M, F, A, Props}, _]) when is_list(Props) -> + %% this kind of weird stacktrace can be generated by a uncaught throw in a gen_server + format_mfa({M, F, A, Props}); format_mfa(Other) -> io_lib:format("~w", [Other]). diff --git a/test/crash.erl b/test/crash.erl index 25084e9..1c22a39 100644 --- a/test/crash.erl +++ b/test/crash.erl @@ -85,6 +85,8 @@ handle_call(badarity, _, State) -> F = fun(A, B, C) -> A + B + C end, Res = F(State), {reply, Res, State}; +handle_call(throw, _, State) -> + throw(a_ball); handle_call(_Call, _From, State) -> {reply, ok, State}. diff --git a/test/lager_test_backend.erl b/test/lager_test_backend.erl index 3813732..64a04f5 100644 --- a/test/lager_test_backend.erl +++ b/test/lager_test_backend.erl @@ -305,6 +305,15 @@ error_logger_redirect_crash_test_() -> ?assertEqual(Expected, lists:flatten(Msg)) end }, + {"bad return value uncaught throw", + fun() -> + Pid = whereis(crash), + crash(throw), + {_, _, Msg} = pop(), + Expected = lists:flatten(io_lib:format("[error] ~w gen_server crash terminated with reason: bad return value: a_ball", [Pid])), + ?assertEqual(Expected, lists:flatten(Msg)) + end + }, {"case clause", fun() -> Pid = whereis(crash),