aboutsummaryrefslogtreecommitdiffstats
path: root/lib/debugger/src/dbg_istk.erl
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2011-03-31 07:31:14 +0200
committerBjörn Gustavsson <[email protected]>2011-08-16 08:58:47 +0200
commite0fe23461cc94a80e02a9542ab2182f62badd5de (patch)
tree2ec0499d0b23c64d88880eb1c8e8c8830dfce8ea /lib/debugger/src/dbg_istk.erl
parent3ccc4730e54f0f9e86bf96360b7600ab8c9e1d47 (diff)
downloadotp-e0fe23461cc94a80e02a9542ab2182f62badd5de.tar.gz
otp-e0fe23461cc94a80e02a9542ab2182f62badd5de.tar.bz2
otp-e0fe23461cc94a80e02a9542ab2182f62badd5de.zip
Don't build stacktrace until erlang:get_stacktrace() is called
Currently, dbg_istk:exception_stacktrace/2 does not do a very good job imitating BEAM's stacktrace. The reason is that it need to be relatively fast since a simulated stacktrace is constructed not only when an exception oocurs, but also before every call to non-interpreted code. To prepare for a future more thorough (and slower) stacktrace construction, refactor the building of the stacktrace so that it only is done when erlang:get_stacktrace/0 is called.
Diffstat (limited to 'lib/debugger/src/dbg_istk.erl')
-rw-r--r--lib/debugger/src/dbg_istk.erl34
1 files changed, 21 insertions, 13 deletions
diff --git a/lib/debugger/src/dbg_istk.erl b/lib/debugger/src/dbg_istk.erl
index 2e7b114fab..2c4c2a3518 100644
--- a/lib/debugger/src/dbg_istk.erl
+++ b/lib/debugger/src/dbg_istk.erl
@@ -19,7 +19,7 @@
-module(dbg_istk).
-export([init/0,to_external/0,from_external/1,
push/2,pop/0,pop/1,stack_level/0,
- exception_stacktrace/2,
+ delayed_stacktrace/0,delayed_stacktrace/1,
bindings/1,stack_frame/2,backtrace/2,
in_use_p/2]).
@@ -106,25 +106,33 @@ stack_level() ->
stack_level([]) -> 1;
stack_level([#e{level=Le}|_]) -> Le.
-%% exception_stacktrace(HowMuch, #ieval{}) -> Stacktrace
-%% HowMuch = complete | no_current
-%% Stacktrace = [{M,F,Args|Arity} | {Fun,Args}]
-%% Convert internal stack format to an imitation of the
-%% regular stacktrace.
+%% delayed_stacktrace() -> CreateStacktraceFun
+%% delayed_stacktrace(#ieval{}) -> CreateStacktraceFun
+%% CreateStacktraceFun = fun(NumberOfEntries)
+%%
+%% Return a fun that can convert the internal stack format to
+%% an imitation of the regular stacktrace.
%%
%% Max three elements, no repeated (recursive) calls to the same
%% function and convert argument lists to arity for all but the topmost
%% entry (and funs).
-exception_stacktrace(complete, #ieval{}=Ieval) ->
+delayed_stacktrace() ->
+ Stack = get(?STACK),
+ do_delayed_stacktrace(Stack).
+
+delayed_stacktrace(Ieval) ->
#ieval{module=Mod,function=Name,arguments=As} = Ieval,
- Stk = [#e{mfa={Mod,Name,As}}|get(?STACK)],
- fix_stacktrace(Stk);
-exception_stacktrace(no_current, #ieval{}) ->
- fix_stacktrace(get(?STACK)).
+ Stack = [#e{mfa={Mod,Name,As}}|get(?STACK)],
+ do_delayed_stacktrace(Stack).
+
+do_delayed_stacktrace(Stack) ->
+ fun(_NumEntries) ->
+ fix_stacktrace(Stack)
+ end.
-fix_stacktrace(Stk) ->
- case fix_stacktrace2(sublist(Stk, 1, 3)) of
+fix_stacktrace(Stack) ->
+ case fix_stacktrace2(sublist(Stack, 1, 3)) of
[] ->
[];
[H|T] ->