int erts_clear_module_break(Module *modp) { BeamCodeHeader* code_hdr; Uint n; Uint i; ERTS_SMP_LC_ASSERT(erts_smp_thr_progress_is_blocking()); ASSERT(modp); code_hdr = modp->curr.code_hdr; if (!code_hdr) { return 0; } n = (Uint)(UWord) code_hdr->num_functions; for (i = 0; i < n; ++i) { ErtsCodeInfo *ci = code_hdr->functions[i]; if (erts_is_function_native(ci)) continue; clear_function_break(ci, ERTS_BPF_ALL); } erts_commit_staged_bp(); for (i = 0; i < n; ++i) { ErtsCodeInfo *ci = code_hdr->functions[i]; if (erts_is_function_native(ci)) continue; uninstall_breakpoint(ci); consolidate_bp_data(modp, ci, 1); ASSERT(ci->u.gen_bp == NULL); } return n; }
void erts_clear_export_break(Module* modp, BeamInstr* pc) { ERTS_SMP_LC_ASSERT(erts_smp_thr_progress_is_blocking()); clear_function_break(pc, ERTS_BPF_ALL); erts_commit_staged_bp(); *pc = (BeamInstr) 0; consolidate_bp_data(modp, pc, 0); ASSERT(pc[-4] == 0); }
void erts_clear_export_break(Module* modp, ErtsCodeInfo *ci) { ERTS_SMP_LC_ASSERT(erts_smp_thr_progress_is_blocking()); clear_function_break(ci, ERTS_BPF_ALL); erts_commit_staged_bp(); *erts_codeinfo_to_code(ci) = (BeamInstr) 0; consolidate_bp_data(modp, ci, 0); ASSERT(ci->u.gen_bp == NULL); }
int erts_clear_module_break(Module *modp) { BeamCodeHeader* code_hdr; Uint n; Uint i; ERTS_SMP_LC_ASSERT(erts_smp_thr_progress_is_blocking()); ASSERT(modp); code_hdr = modp->curr.code_hdr; if (!code_hdr) { return 0; } n = (Uint)(UWord) code_hdr->num_functions; for (i = 0; i < n; ++i) { BeamInstr* pc; pc = code_hdr->functions[i] + 5; if (erts_is_native_break(pc)) { continue; } clear_function_break(pc, ERTS_BPF_ALL); } erts_commit_staged_bp(); for (i = 0; i < n; ++i) { BeamInstr* pc; pc = code_hdr->functions[i] + 5; if (erts_is_native_break(pc)) { continue; } uninstall_breakpoint(pc); consolidate_bp_data(modp, pc, 1); ASSERT(pc[-4] == 0); } return n; }
int erts_clear_module_break(Module *modp) { BeamInstr** code_base; Uint n; Uint i; ERTS_SMP_LC_ASSERT(erts_smp_thr_progress_is_blocking()); ASSERT(modp); code_base = (BeamInstr **) modp->curr.code; if (code_base == NULL) { return 0; } n = (Uint)(UWord) code_base[MI_NUM_FUNCTIONS]; for (i = 0; i < n; ++i) { BeamInstr* pc; pc = code_base[MI_FUNCTIONS+i] + 5; if (erts_is_native_break(pc)) { continue; } clear_function_break(pc, ERTS_BPF_ALL); } erts_commit_staged_bp(); for (i = 0; i < n; ++i) { BeamInstr* pc; pc = code_base[MI_FUNCTIONS+i] + 5; if (erts_is_native_break(pc)) { continue; } uninstall_breakpoint(pc); consolidate_bp_data(modp, pc, 1); ASSERT(pc[-4] == 0); } return n; }
BIF_RETTYPE erts_debug_breakpoint_2(BIF_ALIST_2) { Process* p = BIF_P; Eterm MFA = BIF_ARG_1; Eterm boolean = BIF_ARG_2; Eterm* tp; ErtsCodeMFA mfa; int i; int specified = 0; Eterm res; BpFunctions f; if (boolean != am_true && boolean != am_false) goto error; if (is_not_tuple(MFA)) { goto error; } tp = tuple_val(MFA); if (*tp != make_arityval(3)) { goto error; } if (!is_atom(tp[1]) || !is_atom(tp[2]) || (!is_small(tp[3]) && tp[3] != am_Underscore)) { goto error; } for (i = 0; i < 3 && tp[i+1] != am_Underscore; i++, specified++) { /* Empty loop body */ } for (i = specified; i < 3; i++) { if (tp[i+1] != am_Underscore) { goto error; } } mfa.module = tp[1]; mfa.function = tp[2]; if (is_small(tp[3])) { mfa.arity = signed_val(tp[3]); } if (!erts_try_seize_code_write_permission(BIF_P)) { ERTS_BIF_YIELD2(bif_export[BIF_erts_debug_breakpoint_2], BIF_P, BIF_ARG_1, BIF_ARG_2); } erts_proc_unlock(p, ERTS_PROC_LOCK_MAIN); erts_thr_progress_block(); erts_bp_match_functions(&f, &mfa, specified); if (boolean == am_true) { erts_set_debug_break(&f); erts_install_breakpoints(&f); erts_commit_staged_bp(); } else { erts_clear_debug_break(&f); erts_commit_staged_bp(); erts_uninstall_breakpoints(&f); } erts_consolidate_bp_data(&f, 1); res = make_small(f.matched); erts_bp_free_matched_functions(&f); erts_thr_progress_unblock(); erts_proc_lock(p, ERTS_PROC_LOCK_MAIN); erts_release_code_write_permission(); return res; error: BIF_ERROR(p, BADARG); }