summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErlang/OTP <otp@erlang.org>2021-03-31 09:43:29 +0200
committerErlang/OTP <otp@erlang.org>2021-03-31 09:43:29 +0200
commit3a166aad6faead95c91e0e5dce96c738df8ea5ae (patch)
treedcf1e25f7d9546fa529176a86d4afee44fe99ced
parente8cff1c14d6e1393519ec55f4342ade482b35f56 (diff)
parent474bb2ae2784c92f424e51e8e4f07f9ef89b3bf3 (diff)
downloaderlang-3a166aad6faead95c91e0e5dce96c738df8ea5ae.tar.gz
Merge branch 'sverker/erts/trace-call-time-fix/OTP-17290' into maint-22
* sverker/erts/trace-call-time-fix/OTP-17290: erts: Fix bug in call time tracing
-rw-r--r--erts/emulator/beam/beam_bp.c2
-rw-r--r--erts/emulator/test/trace_call_time_SUITE.erl25
2 files changed, 26 insertions, 1 deletions
diff --git a/erts/emulator/beam/beam_bp.c b/erts/emulator/beam/beam_bp.c
index 60fd20b9df..9c475cc411 100644
--- a/erts/emulator/beam/beam_bp.c
+++ b/erts/emulator/beam/beam_bp.c
@@ -661,7 +661,7 @@ static void fixup_cp_before_trace(Process *c_p, int *return_to_trace)
*return_to_trace = 1;
cpp = &E[0];
} else if (BeamIsOpCode(w, op_i_return_time_trace)) {
- cpp = &E[0];
+ cpp = &E[1];
} else {
cpp = NULL;
}
diff --git a/erts/emulator/test/trace_call_time_SUITE.erl b/erts/emulator/test/trace_call_time_SUITE.erl
index a126c48af9..39a188286b 100644
--- a/erts/emulator/test/trace_call_time_SUITE.erl
+++ b/erts/emulator/test/trace_call_time_SUITE.erl
@@ -65,6 +65,7 @@
-export([all/0, suite/0,
init_per_testcase/2, end_per_testcase/2, not_run/1]).
-export([basic/1, on_and_off/1, info/1,
+ apply_bif_bug/1, abb_worker/1,
disable_ongoing/1,
pause_and_restart/1, scheduling/1, called_function/1, combo/1,
bif/1, nif/1]).
@@ -91,6 +92,7 @@ all() ->
false ->
[basic, on_and_off, info, pause_and_restart, scheduling,
disable_ongoing,
+ apply_bif_bug,
combo, bif, nif, called_function, dead_tracer, return_stop]
end.
@@ -778,3 +780,26 @@ loop() ->
Pid ! {self(), answer, erlang:apply(M, F, A)},
loop()
end.
+
+%% OTP-17290, GH-4635
+apply_bif_bug(_Config) ->
+ Pid = spawn(?MODULE, abb_worker, [self()]),
+ erlang:trace(Pid, true, [call]),
+ erlang:trace_pattern({?MODULE,abb_foo,'_'}, true, [call_time]),
+ erlang:trace_pattern({erlang,display,1}, true, [call_time]),
+ Pid ! {call, erlang, display, ["Hej"]},
+ receive
+ done -> ok
+ end,
+ erlang:trace_pattern({'_','_','_'}, false, [call_time]).
+
+abb_worker(Papa) ->
+ receive
+ {call, M, F, Args} ->
+ abb_foo(M, F, Args),
+ Papa ! done
+ end.
+
+
+abb_foo(M,F,Args) ->
+ apply(M,F,Args).