diff options
author | Erlang/OTP <otp@erlang.org> | 2021-03-31 09:43:29 +0200 |
---|---|---|
committer | Erlang/OTP <otp@erlang.org> | 2021-03-31 09:43:29 +0200 |
commit | 3a166aad6faead95c91e0e5dce96c738df8ea5ae (patch) | |
tree | dcf1e25f7d9546fa529176a86d4afee44fe99ced | |
parent | e8cff1c14d6e1393519ec55f4342ade482b35f56 (diff) | |
parent | 474bb2ae2784c92f424e51e8e4f07f9ef89b3bf3 (diff) | |
download | erlang-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.c | 2 | ||||
-rw-r--r-- | erts/emulator/test/trace_call_time_SUITE.erl | 25 |
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). |