aboutsummaryrefslogtreecommitdiffstats
path: root/lib/stdlib/src/gen_statem.erl
diff options
context:
space:
mode:
authorRaimo Niskanen <[email protected]>2018-10-25 14:15:27 +0200
committerRaimo Niskanen <[email protected]>2018-11-16 14:40:44 +0100
commit5d530cdfa1f6d7a75f8933b8ce95df8fdbb82b9e (patch)
treee3b0327604bff195b5112d9de6a50be1de01eb31 /lib/stdlib/src/gen_statem.erl
parent53850d6c310643393185819c179efd4b866943fe (diff)
downloadotp-5d530cdfa1f6d7a75f8933b8ce95df8fdbb82b9e.tar.gz
otp-5d530cdfa1f6d7a75f8933b8ce95df8fdbb82b9e.tar.bz2
otp-5d530cdfa1f6d7a75f8933b8ce95df8fdbb82b9e.zip
Add client stacktrace
Diffstat (limited to 'lib/stdlib/src/gen_statem.erl')
-rw-r--r--lib/stdlib/src/gen_statem.erl51
1 files changed, 45 insertions, 6 deletions
diff --git a/lib/stdlib/src/gen_statem.erl b/lib/stdlib/src/gen_statem.erl
index 016665ef35..aef242bd4b 100644
--- a/lib/stdlib/src/gen_statem.erl
+++ b/lib/stdlib/src/gen_statem.erl
@@ -1937,11 +1937,36 @@ error_info(
state_enter=>StateEnter,
state=>format_status(terminate, get(), S),
log=>Log,
- reason=>{Class,Reason,Stacktrace}},
+ reason=>{Class,Reason,Stacktrace},
+ client_info=>client_stacktrace(Q)},
#{domain=>[otp],
report_cb=>fun gen_statem:format_log/1,
error_logger=>#{tag=>error}}).
+client_stacktrace([]) ->
+ undefined;
+client_stacktrace([{{call,{Pid,_Tag}},_Req}|_]) when is_pid(Pid) ->
+ if
+ node(Pid) =:= node() ->
+ case
+ process_info(Pid, [current_stacktrace, registered_name])
+ of
+ undefined ->
+ {Pid,dead};
+ [{current_stacktrace, Stacktrace},
+ {registered_name, []}] ->
+ {Pid,{Pid,Stacktrace}};
+ [{current_stacktrace, Stacktrace},
+ {registered_name, Name}] ->
+ {Pid,{Name,Stacktrace}}
+ end;
+ true ->
+ {Pid,remote}
+ end;
+client_stacktrace([_|_]) ->
+ undefined.
+
+
format_log(#{label:={gen_statem,terminate},
name:=Name,
queue:=Q,
@@ -1950,7 +1975,8 @@ format_log(#{label:={gen_statem,terminate},
state_enter:=StateEnter,
state:=FmtData,
log:=Log,
- reason:={Class,Reason,Stacktrace}}) ->
+ reason:={Class,Reason,Stacktrace},
+ client_info:=ClientInfo}) ->
{FixedReason,FixedStacktrace} =
case Stacktrace of
[{M,F,Args,_}|ST]
@@ -1976,8 +2002,9 @@ format_log(#{label:={gen_statem,terminate},
end;
_ -> {Reason,Stacktrace}
end,
- [LimitedP, LimitedFmtData, LimitedFixedReason | LimitedLog] =
- [error_logger:limit_term(D) || D <- [P, FmtData, FixedReason | Log]],
+ {ClientFmt,ClientArgs} = format_client_log(ClientInfo),
+ [LimitedP,LimitedFmtData,LimitedFixedReason|LimitedLog] =
+ [error_logger:limit_term(D) || D <- [P,FmtData,FixedReason|Log]],
CBMode =
case StateEnter of
true ->
@@ -2008,7 +2035,7 @@ format_log(#{label:={gen_statem,terminate},
case LimitedLog of
[] -> "";
_ -> "** Log =~n** ~tp~n"
- end,
+ end ++ ClientFmt,
[Name |
case Q of
[] -> [];
@@ -2032,7 +2059,19 @@ format_log(#{label:={gen_statem,terminate},
case LimitedLog of
[] -> [];
_ -> [LimitedLog]
- end}.
+ end ++ ClientArgs}.
+
+format_client_log(undefined) ->
+ {"", []};
+format_client_log({Pid,dead}) ->
+ {"** Client ~p is dead~n", [Pid]};
+format_client_log({Pid,remote}) ->
+ {"** Client ~p is remote on node ~p~n", [Pid, node(Pid)]};
+format_client_log({_Pid,{Name,Stacktrace}}) ->
+ {"** Client ~tp stacktrace~n"
+ "** ~tp~n",
+ [Name, Stacktrace]}.
+
%% Call Module:format_status/2 or return a default value
format_status(