Blob Blame History Raw
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org>
Date: Tue, 25 Aug 2015 15:20:23 +0200
Subject: [PATCH] Teach sasl_report to limit crash reports


diff --git a/lib/sasl/src/sasl_report.erl b/lib/sasl/src/sasl_report.erl
index c3e6fed..aa84e4f 100644
--- a/lib/sasl/src/sasl_report.erl
+++ b/lib/sasl/src/sasl_report.erl
@@ -61,27 +61,53 @@ write_report2(IO, Fd, Head, supervisor_report, Report) ->
     Context = sup_get(errorContext, Report),
     Reason = sup_get(reason, Report),
     Offender = sup_get(offender, Report),
-    FmtString = "     Supervisor: ~p~n     Context:    ~p~n     Reason:     "
-	"~80.18p~n     Offender:   ~80.18p~n~n",
-    write_report_action(IO, Fd, Head ++ FmtString,
-			[Name,Context,Reason,Offender]);
+    {FmtString,Args} = supervisor_format([Name,Context,Reason,Offender]),
+    write_report_action(IO, Fd, Head, FmtString, Args);
 write_report2(IO, Fd, Head, progress, Report) ->
     Format = format_key_val(Report),
-    write_report_action(IO, Fd, Head ++ "~s", [Format]);
+    write_report_action(IO, Fd, Head, "~s", [Format]);
 write_report2(IO, Fd, Head, crash_report, Report) ->
-    Format = proc_lib:format(Report),
-    write_report_action(IO, Fd, Head ++ "~s", [Format]).
+    Depth = get_depth(),
+    Format = proc_lib:format(Report, latin1, Depth),
+    write_report_action(IO, Fd, Head, "~s", [Format]).
+
+supervisor_format(Args0) ->
+    case get_depth() of
+	unlimited ->
+	    {"     Supervisor: ~p~n"
+	     "     Context:    ~p~n"
+	     "     Reason:     ~80.18p~n"
+	     "     Offender:   ~80.18p~n~n",
+	     Args0};
+	Depth ->
+	    [A,B,C,D] = Args0,
+	    Args = [A,Depth,B,Depth,C,Depth,D,Depth],
+	    {"     Supervisor: ~P~n"
+	     "     Context:    ~P~n"
+	     "     Reason:     ~80.18P~n"
+	     "     Offender:   ~80.18P~n~n",
+	     Args}
+    end.
 
-write_report_action(io, Fd, Format, Args) ->
-    io:format(Fd, Format, Args);
-write_report_action(io_lib, _Fd, Format, Args) ->
-    io_lib:format(Format, Args).
+write_report_action(IO, Fd, Head, Format, Args) ->
+    S = [Head|io_lib:format(Format, Args)],
+    case IO of
+	io -> io:put_chars(Fd, S);
+	io_lib -> S
+    end.
 
 format_key_val([{Tag,Data}|Rep]) ->
     io_lib:format("    ~16w: ~p~n",[Tag,Data]) ++ format_key_val(Rep);
 format_key_val(_) ->
     [].
 
+get_depth() ->
+    case application:get_env(kernel, error_logger_format_depth) of
+	{ok, Depth} when is_integer(Depth) ->
+	    max(10, Depth);
+	undefined ->
+	    unlimited
+    end.
 
 sup_get(Tag, Report) ->
     case lists:keysearch(Tag, 1, Report) of