aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/erl_bif_trace.c
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2012-08-27 16:53:06 +0200
committerBjörn Gustavsson <[email protected]>2012-08-28 09:34:06 +0200
commit2848eb10d0c006f4498acddfdf89830ec1040c11 (patch)
tree133b9faf875c4e26ef3e8024bfcacbe153319085 /erts/emulator/beam/erl_bif_trace.c
parente5524c796e878c8bb3e878ad40f03dcf8026b457 (diff)
downloadotp-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.c19
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);
+ }
}
}