浏览代码

ft: try 捕获堆栈

master
SisMaker 4 年前
父节点
当前提交
67e1a1c42d
共有 3 个文件被更改,包括 81 次插入49 次删除
  1. +23
    -9
      src/gen_emm.erl
  2. +41
    -30
      src/gen_ipc.erl
  3. +17
    -10
      src/gen_srv.erl

+ 23
- 9
src/gen_emm.erl 查看文件

@ -14,7 +14,7 @@
, stop/1, stop/3
, call/3, call/4
, send/3
, send_request/3, wait_response/2, check_response/2
, send_request/3, wait_response/2, receive_response/2, check_response/2
, info_notify/2, call_notify/2
, add_epm/3, add_sup_epm/3, del_epm/3
, swap_epm/3, swap_sup_epm/3
@ -104,6 +104,7 @@
{'ok', {pid(), reference()}} |
{'error', term()}.
-type from() :: {To :: pid(), Tag :: term()}.
-type requestId() :: term().
-record(epmHer, {
@ -267,14 +268,20 @@ send(EpmSrv, EpmHandler, Msg) ->
send_request(EpmSrv, EpmHandler, Query) ->
gen:send_request(EpmSrv, '$epm_call', {'$epmCall', EpmHandler, Query}).
-spec wait_response(RequestId :: requestId(), timeout()) ->
{reply, Reply :: term()} | 'timeout' | {error, {Reason :: term(), serverRef()}}.
-spec wait_response(RequestId :: requestId(), timeout()) -> {reply, Reply :: term()} | 'timeout' | {error, {Reason :: term(), serverRef()}}.
wait_response(RequestId, Timeout) ->
case gen:wait_response(RequestId, Timeout) of
{reply, {error, _} = Err} -> Err;
Return -> Return
end.
-spec receive_response(RequestId::requestId(), timeout()) -> {reply, Reply::term()} | 'timeout' | {error, {Reason::term(), serverRef()}}.
receive_response(RequestId, Timeout) ->
case gen:receive_response(RequestId, Timeout) of
{reply, {error, _} = Err} -> Err;
Return -> Return
end.
-spec check_response(Msg :: term(), RequestId :: requestId()) ->
{reply, Reply :: term()} | 'no_reply' | {error, {Reason :: term(), serverRef()}}.
check_response(Msg, RequestId) ->
@ -287,8 +294,8 @@ epmRpc(EpmSrv, Cmd) ->
try gen:call(EpmSrv, '$epm_call', Cmd, infinity) of
{ok, Reply} ->
Reply
catch Class:Reason:S ->
erlang:raise(Class, {Reason, {?MODULE, call, [EpmSrv, Cmd, infinity]}}, S)
catch Class:Reason ->
erlang:raise(Class, {Reason, {?MODULE, call, [EpmSrv, Cmd, infinity]}}, ?STACKTRACE())
end.
epmRpc(EpmSrv, Cmd, Timeout) ->
@ -438,8 +445,8 @@ doAddEpm(EpmHers, {Module, _SubId} = EpmId, Args, EpmSup) ->
catch
throw:Ret ->
addNewEpm(Ret, EpmHers, Module, EpmId, EpmSup);
C:R ->
{{error, {C, R, ?STACKTRACE()}}, EpmHers, false}
C:R:S ->
{{error, {C, R, S}}, EpmHers, false}
end
end;
doAddEpm(EpmHers, Module, Args, EpmSup) ->
@ -453,8 +460,8 @@ doAddEpm(EpmHers, Module, Args, EpmSup) ->
catch
throw:Ret ->
addNewEpm(Ret, EpmHers, Module, Module, EpmSup);
C:R ->
{{error, {C, R, ?STACKTRACE()}}, EpmHers, false}
C:R:S ->
{{error, {C, R, S}}, EpmHers, false}
end
end.
@ -675,6 +682,10 @@ epmTerminate(#epmHer{epmM = EpmM, epmS = State} = EpmHer, Args, LastIn, Reason)
ok
end.
-spec reply(From :: from(), Reply :: term()) -> ok.
reply({_To, [alias|Alias] = Tag}, Reply) ->
Alias ! {Tag, Reply},
ok;
reply({To, Ref}, Msg) ->
try To ! {Ref, Msg},
ok
@ -684,6 +695,9 @@ reply({To, Ref}, Msg) ->
try_reply(false, _Msg) ->
ignore;
try_reply({_To, [alias|Alias] = Tag}, Reply) ->
Alias ! {Tag, Reply},
ok;
try_reply({To, Ref}, Msg) ->
try To ! {Ref, Msg},
ok

+ 41
- 30
src/gen_ipc.erl 查看文件

@ -13,7 +13,7 @@
, cast/2, send/2
, abcast/2, abcast/3
, call/2, call/3
, send_request/2, wait_response/1, wait_response/2, check_response/2
, send_request/2, wait_response/1, wait_response/2, receive_response/1, receive_response/2, check_response/2
, multi_call/2, multi_call/3, multi_call/4
, enter_loop/4, enter_loop/5, enter_loop/6
, reply/1, reply/2
@ -365,7 +365,7 @@ doModuleInit(Module, Args) ->
Module:init(Args)
catch
throw:Ret -> Ret;
Class:Reason -> {'EXIT', Class, Reason, ?STACKTRACE()}
Class:Reason:Stacktrace -> {'EXIT', Class, Reason, Stacktrace}
end.
init_it(Starter, self, ServerRef, Module, Args, Opts) ->
@ -685,6 +685,14 @@ wait_response(RequestId) ->
wait_response(RequestId, Timeout) ->
gen:wait_response(RequestId, Timeout).
-spec receive_response(RequestId::serverRef()) -> {reply, Reply::term()} | {error, {term(), serverRef()}}.
receive_response(RequestId) ->
gen:receive_response(RequestId, infinity).
-spec receive_response(RequestId::requestId(), timeout()) -> {reply, Reply::term()} | 'timeout' | {error, {term(), serverRef()}}.
receive_response(RequestId, Timeout) ->
gen:receive_response(RequestId, Timeout).
-spec check_response(Msg :: term(), RequestId :: requestId()) ->
{reply, Reply :: term()} | 'no_reply' | {error, {term(), serverRef()}}.
check_response(Msg, RequestId) ->
@ -820,6 +828,9 @@ reply(Replies) when is_list(Replies) ->
ok.
-spec reply(From :: from(), Reply :: term()) -> ok.
reply({_To, [alias|Alias] = Tag}, Reply) ->
Alias ! {Tag, Reply},
ok;
reply({To, Tag}, Reply) ->
try To ! {Tag, Reply},
ok
@ -937,8 +948,8 @@ doAddEpm(EpmHers, {Module, _SubId} = EpmId, Args, EpmSup) ->
catch
throw:Ret ->
addNewEpm(Ret, EpmHers, Module, EpmId, EpmSup);
C:R ->
{{error, {C, R, ?STACKTRACE()}}, EpmHers, false}
C:R:S ->
{{error, {C, R, S}}, EpmHers, false}
end
end;
doAddEpm(EpmHers, Module, Args, EpmSup) ->
@ -952,8 +963,8 @@ doAddEpm(EpmHers, Module, Args, EpmSup) ->
catch
throw:Ret ->
addNewEpm(Ret, EpmHers, Module, Module, EpmSup);
C:R ->
{{error, {C, R, ?STACKTRACE()}}, EpmHers, false}
C:R:S ->
{{error, {C, R, S}}, EpmHers, false}
end
end.
@ -1012,8 +1023,8 @@ doEpmHandle(EpmHers, EpmHandler, Func, Event, From) ->
catch
throw:Ret ->
handleEpmCR(Ret, EpmHers, EpmHer, Event, From);
C:R ->
epmTerminate(EpmHer, {error, {C, R, ?STACKTRACE()}}, Event, crash),
C:R:S ->
epmTerminate(EpmHer, {error, {C, R, S}}, Event, crash),
NewEpmHers = maps:remove(EpmHandler, EpmHers),
{NewEpmHers, false}
end;
@ -1211,8 +1222,8 @@ matchCallMsg(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Post
catch
throw:Result ->
handleEventCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent], Result, ?CB_FORM_EVENT, From);
Class:Reason ->
terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent])
Class:Reason:Strace ->
terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent])
end.
matchCastMsg(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, Cast) ->
@ -1224,8 +1235,8 @@ matchCastMsg(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Post
catch
throw:Result ->
handleEventCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent], Result, ?CB_FORM_EVENT, false);
Class:Reason ->
terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent])
Class:Reason:Strace ->
terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent])
end.
matchInfoMsg(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, Msg) ->
@ -1237,8 +1248,8 @@ matchInfoMsg(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Post
catch
throw:Result ->
handleEventCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent], Result, ?CB_FORM_EVENT, false);
Class:Reason ->
terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent])
Class:Reason:Strace ->
terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent])
end.
matchTimeoutMsg(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, TimeoutType, TimeoutMsg) ->
@ -1250,8 +1261,8 @@ matchTimeoutMsg(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, P
catch
throw:Result ->
handleEventCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent], Result, ?CB_FORM_EVENT, false);
Class:Reason ->
terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent])
Class:Reason:Strace ->
terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent])
end.
matchEpmCallMsg(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, From, Request) ->
@ -1309,8 +1320,8 @@ startEpmCall(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Post
catch
throw:Ret ->
handleEventCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [Event], Ret, ?CB_FORM_EVENT, false);
Class:Reason ->
terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [Event])
Class:Reason:Strace ->
terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [Event])
end;
_ ->
receiveIng(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, IsHib)
@ -1323,8 +1334,8 @@ startEnterCall(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Po
catch
throw:Result ->
handleEnterCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, PrevStatus, CurState, CurStatus, Debug, LeftEvents, NextEs, IsPos, IsHib, DoAfter, Result);
Class:Reason ->
terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents)
Class:Reason:Strace ->
terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents)
end.
startAfterCall(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents, Args) ->
@ -1334,8 +1345,8 @@ startAfterCall(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Po
catch
throw:Result ->
handleEventCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents, Result, ?CB_FORM_AFTER, false);
Class:Reason ->
terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents)
Class:Reason:Strace ->
terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents)
end.
startEventCall(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents, {Type, Content}) ->
@ -1347,8 +1358,8 @@ startEventCall(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Po
catch
throw:Ret ->
handleEventCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents, Ret, ?CB_FORM_EVENT, false);
Class:Reason ->
terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents)
Class:Reason:Strace ->
terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents)
end;
'info' ->
try Module:handleInfo(Content, CurStatus, CurState) of
@ -1357,8 +1368,8 @@ startEventCall(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Po
catch
throw:Ret ->
handleEventCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents, Ret, ?CB_FORM_EVENT, false);
Class:Reason ->
terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents)
Class:Reason:Strace ->
terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents)
end;
{'call', From} ->
try Module:handleCall(Content, CurStatus, CurState, From) of
@ -1367,8 +1378,8 @@ startEventCall(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Po
catch
throw:Ret ->
handleEventCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents, Ret, ?CB_FORM_EVENT, From);
Class:Reason ->
terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents)
Class:Reason:Strace ->
terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents)
end;
_ ->
try Module:handleOnevent(Type, Content, CurStatus, CurState) of
@ -1377,8 +1388,8 @@ startEventCall(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Po
catch
throw:Ret ->
handleEventCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents, Ret, ?CB_FORM_EVENT, false);
Class:Reason ->
terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents)
Class:Reason:Strace ->
terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents)
end
end.

+ 17
- 10
src/gen_srv.erl 查看文件

@ -11,7 +11,7 @@
, start_monitor/3, start_monitor/4
, stop/1, stop/3
, call/2, call/3
, send_request/2, wait_response/2, check_response/2
, send_request/2, wait_response/2, receive_response/2, check_response/2
, cast/2, send/2, reply/1, reply/2
, abcast/2, abcast/3
, multi_call/2, multi_call/3, multi_call/4
@ -197,7 +197,7 @@ doModuleInit(Module, Args) ->
Module:init(Args)
catch
throw:Ret -> Ret;
Class:Reason -> {'EXIT', Class, Reason, ?STACKTRACE()}
Class:Reason:Strace -> {'EXIT', Class, Reason, Strace}
end.
init_it(Starter, self, ServerRef, Module, Args, Options) ->
@ -521,6 +521,9 @@ reply(Replies) when is_list(Replies) ->
ok.
-spec reply(From :: from(), Reply :: term()) -> ok.
reply({_To, [alias|Alias] = Tag}, Reply) ->
Alias ! {Tag, Reply},
ok;
reply({To, Tag}, Reply) ->
try To ! {Tag, Reply},
ok
@ -542,6 +545,10 @@ send_request(Name, Request) ->
wait_response(RequestId, Timeout) ->
gen:wait_response(RequestId, Timeout).
-spec receive_response(RequestId::requestId(), timeout()) -> {reply, Reply::term()} | 'timeout' | {error, {Reason::term(), serverRef()}}.
receive_response(RequestId, Timeout) ->
gen:receive_response(RequestId, Timeout).
-spec check_response(Msg :: term(), RequestId :: requestId()) ->
{reply, Reply :: term()} | 'no_reply' | {error, {Reason :: term(), serverRef()}}.
check_response(Msg, RequestId) ->
@ -708,8 +715,8 @@ matchCallMsg(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurStat
catch
throw:Result ->
handleCR(Parent, Name, Module, HibernateAfterTimeout, NewDebug, Timers, CurState, Result, From);
Class:Reason ->
terminate(Class, Reason, ?STACKTRACE(), Name, Module, NewDebug, Timers, CurState, {{call, From}, Request})
Class:Reason:Strace ->
terminate(Class, Reason, Strace, Name, Module, NewDebug, Timers, CurState, {{call, From}, Request})
end.
matchCastMsg(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurState, Cast) ->
@ -720,8 +727,8 @@ matchCastMsg(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurStat
catch
throw:Result ->
handleCR(Parent, Name, Module, HibernateAfterTimeout, NewDebug, Timers, CurState, Result, false);
Class:Reason ->
terminate(Class, Reason, ?STACKTRACE(), Name, Module, NewDebug, Timers, CurState, {cast, Cast})
Class:Reason:Strace ->
terminate(Class, Reason, Strace, Name, Module, NewDebug, Timers, CurState, {cast, Cast})
end.
matchInfoMsg(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurState, Msg) ->
@ -732,8 +739,8 @@ matchInfoMsg(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurStat
catch
throw:Result ->
handleCR(Parent, Name, Module, HibernateAfterTimeout, NewDebug, Timers, CurState, Result, false);
Class:Reason ->
terminate(Class, Reason, ?STACKTRACE(), Name, Module, NewDebug, Timers, CurState, {info, Msg})
Class:Reason:Strace ->
terminate(Class, Reason, Strace, Name, Module, NewDebug, Timers, CurState, {info, Msg})
end.
doAfterCall(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurState, LeftAction, Args) ->
@ -744,8 +751,8 @@ doAfterCall(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurState
catch
throw:Result ->
handleAR(Parent, Name, Module, HibernateAfterTimeout, NewDebug, Timers, CurState, LeftAction, Result);
Class:Reason ->
terminate(Class, Reason, ?STACKTRACE(), Name, Module, NewDebug, Timers, CurState, {doAfter, Args})
Class:Reason:Strace ->
terminate(Class, Reason, Strace, Name, Module, NewDebug, Timers, CurState, {doAfter, Args})
end.
handleCR(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurState, Result, From) ->

正在加载...
取消
保存