diff options
author | Björn Gustavsson <[email protected]> | 2011-03-31 08:19:21 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2011-08-16 08:58:48 +0200 |
commit | 19713d214462b863def874385844521f00a2bac5 (patch) | |
tree | b750efbf15db4cdb643da8fb3e97c33f94da12f2 | |
parent | 3a7e7db5280dfdc7ef6488fb66a2cf60950ca34c (diff) | |
download | otp-19713d214462b863def874385844521f00a2bac5.tar.gz otp-19713d214462b863def874385844521f00a2bac5.tar.bz2 otp-19713d214462b863def874385844521f00a2bac5.zip |
Delay saving of the stack in exit_info when an exception occurs
When an exception occurs, the entire stack will be converted to
the external term format and kept in the exit_info variable in
the process dictionary. But the exit_info variable will only be
needed if the exception causes the process to terminate (not if
it is caught).
Delay the conversion of the stack to external format. That can
save significant amounts of time (e.g. in bs_construct:mem_leak/1).
-rw-r--r-- | lib/debugger/src/dbg_ieval.erl | 11 | ||||
-rw-r--r-- | lib/debugger/src/dbg_istk.erl | 7 |
2 files changed, 11 insertions, 7 deletions
diff --git a/lib/debugger/src/dbg_ieval.erl b/lib/debugger/src/dbg_ieval.erl index a9a5e171f7..9b6919074f 100644 --- a/lib/debugger/src/dbg_ieval.erl +++ b/lib/debugger/src/dbg_ieval.erl @@ -140,12 +140,12 @@ check_exit_msg({'DOWN',_,_,_,Reason}, Bs, undefined when Le =:= 1 -> % died outside interpreted code {}; undefined when Le > 1 -> - StackExternal = dbg_istk:to_external(), + StackExternal = (dbg_istk:delayed_to_external())(), {{Mod, Li}, Bs, StackExternal}; %% Debugged has terminated due to an exception - ExitInfo0 -> - ExitInfo0 + ExitInfo0 when is_function(ExitInfo0, 0) -> + ExitInfo0() end, dbg_iserver:cast(get(int), {set_exit_info,self(),ExitInfo}), @@ -180,7 +180,10 @@ exception(Class, Reason, Bs, Ieval, true) -> Bs, Ieval). do_exception(Class, Reason, Stacktrace, Bs, #ieval{module=M, line=Line}) -> - ExitInfo = {{M,Line}, Bs, dbg_istk:to_external()}, + StackFun = dbg_istk:delayed_to_external(), + ExitInfo = fun() -> + {{M,Line},Bs,StackFun()} + end, put(exit_info, ExitInfo), put(stacktrace, Stacktrace), erlang:Class(Reason). diff --git a/lib/debugger/src/dbg_istk.erl b/lib/debugger/src/dbg_istk.erl index 34070aa8f2..a0d3069d50 100644 --- a/lib/debugger/src/dbg_istk.erl +++ b/lib/debugger/src/dbg_istk.erl @@ -17,7 +17,7 @@ %% %CopyrightEnd% %% -module(dbg_istk). --export([init/0,to_external/0,from_external/1, +-export([init/0,delayed_to_external/0,from_external/1, push/2,pop/0,pop/1,stack_level/0, delayed_stacktrace/0,delayed_stacktrace/2, bindings/1,stack_frame/2,backtrace/2, @@ -37,8 +37,9 @@ init() -> init([]). -to_external() -> - {stack,term_to_binary(get(?STACK))}. +delayed_to_external() -> + Stack = get(?STACK), + fun() -> {stack,term_to_binary(Stack)} end. from_external({stack,Stk}) -> put(?STACK, binary_to_term(Stk)). |