aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/debugger/src/dbg_ieval.erl11
-rw-r--r--lib/debugger/src/dbg_istk.erl7
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)).