diff options
author | Björn Gustavsson <[email protected]> | 2012-08-27 16:53:06 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2012-08-28 09:34:06 +0200 |
commit | 2848eb10d0c006f4498acddfdf89830ec1040c11 (patch) | |
tree | 133b9faf875c4e26ef3e8024bfcacbe153319085 /erts/emulator/beam/erl_bif_trace.c | |
parent | e5524c796e878c8bb3e878ad40f03dcf8026b457 (diff) | |
download | otp-2848eb10d0c006f4498acddfdf89830ec1040c11.tar.gz otp-2848eb10d0c006f4498acddfdf89830ec1040c11.tar.bz2 otp-2848eb10d0c006f4498acddfdf89830ec1040c11.zip |
Make sure that turning off local trace does not turn off global trace
Attempting to turn off local call trace when there was global call
trace enabled would incorrectly turn off the global call trace.
This bug was introduced in bf5bf8b93dccca86c4775b21ee0db49eb6a3b133.
Diffstat (limited to 'erts/emulator/beam/erl_bif_trace.c')
-rw-r--r-- | erts/emulator/beam/erl_bif_trace.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/erts/emulator/beam/erl_bif_trace.c b/erts/emulator/beam/erl_bif_trace.c index 6515eafbd5..06cec1795d 100644 --- a/erts/emulator/beam/erl_bif_trace.c +++ b/erts/emulator/beam/erl_bif_trace.c @@ -1369,12 +1369,8 @@ erts_set_trace_pattern(Process*p, Eterm* mfa, int specified, BeamInstr* pc = fp[i].pc; Export* ep = (Export *)(((char *)(pc-3)) - offsetof(Export, code)); - if (!on || flags.breakpoint) { - erts_clear_call_trace_bif(pc, 0); - if (pc[0] == (BeamInstr) BeamOp(op_i_generic_breakpoint)) { - pc[0] = (BeamInstr) BeamOp(op_jump_f); - } - } else { + if (on && !flags.breakpoint) { + /* Turn on global call tracing */ if (ep->addressv[code_ix] != pc) { fp[i].mod->curr.num_traced_exports++; #ifdef DEBUG @@ -1387,6 +1383,17 @@ erts_set_trace_pattern(Process*p, Eterm* mfa, int specified, if (ep->addressv[code_ix] != pc) { pc[0] = (BeamInstr) BeamOp(op_i_generic_breakpoint); } + } else if (!on && flags.breakpoint) { + /* Turn off breakpoint tracing -- nothing to do here. */ + } else { + /* + * Turn off global tracing, either explicitly or implicitly + * before turning on breakpoint tracing. + */ + erts_clear_call_trace_bif(pc, 0); + if (pc[0] == (BeamInstr) BeamOp(op_i_generic_breakpoint)) { + pc[0] = (BeamInstr) BeamOp(op_jump_f); + } } } |