BIF_RETTYPE loaded_0(BIF_ALIST_0) { ErtsCodeIndex code_ix = erts_active_code_ix(); Module* modp; Eterm previous = NIL; Eterm* hp; int i; int j = 0; for (i = 0; i < module_code_size(code_ix); i++) { if ((modp = module_code(i, code_ix)) != NULL && ((modp->curr.code_length != 0) || (modp->old.code_length != 0))) { j++; } } if (j > 0) { hp = HAlloc(BIF_P, j*2); for (i = 0; i < module_code_size(code_ix); i++) { if ((modp=module_code(i,code_ix)) != NULL && ((modp->curr.code_length != 0) || (modp->old.code_length != 0))) { previous = CONS(hp, make_atom(modp->module), previous); hp += 2; } } } BIF_RET(previous); }
static int set_break(Eterm mfa[3], int specified, Binary *match_spec, Eterm break_op, enum erts_break_op count_op, Eterm tracer_pid) { Module *modp; int num_processed = 0; if (!specified) { /* Find and process all modules in the system... */ int current; int last = module_code_size(); for (current = 0; current < last; current++) { modp = module_code(current); ASSERT(modp != NULL); num_processed += set_module_break(modp, mfa, specified, match_spec, break_op, count_op, tracer_pid); } } else { /* Process a single module */ if ((modp = erts_get_module(mfa[0])) != NULL) { num_processed += set_module_break(modp, mfa, specified, match_spec, break_op, count_op, tracer_pid); } } return num_processed; }
BIF_RETTYPE loaded_0(BIF_ALIST_0) { Eterm previous = NIL; Eterm* hp; int i; int j = 0; for (i = 0; i < module_code_size(); i++) { if (module_code(i) != NULL && ((module_code(i)->code_length != 0) || (module_code(i)->old_code_length != 0))) { j++; } } if (j > 0) { hp = HAlloc(BIF_P, j*2); for (i = 0; i < module_code_size(); i++) { if (module_code(i) != NULL && ((module_code(i)->code_length != 0) || (module_code(i)->old_code_length != 0))) { previous = CONS(hp, make_atom(module_code(i)->module), previous); hp += 2; } } } BIF_RET(previous); }
static int clear_break(Eterm mfa[3], int specified, Uint break_op) { int num_processed = 0; Module *modp; if (!specified) { /* Iterate over all modules */ int current; int last = module_code_size(); for (current = 0; current < last; current++) { modp = module_code(current); ASSERT(modp != NULL); num_processed += clear_module_break(modp, mfa, specified, break_op); } } else { /* Process a single module */ if ((modp = erts_get_module(mfa[0])) != NULL) { num_processed += clear_module_break(modp, mfa, specified, break_op); } } return num_processed; }
void erts_bp_match_functions(BpFunctions* f, Eterm mfa[3], int specified) { ErtsCodeIndex code_ix = erts_active_code_ix(); Uint max_funcs = 0; int current; int max_modules = module_code_size(code_ix); int num_modules = 0; Module* modp; Module** module; Uint i; module = (Module **) Alloc(max_modules*sizeof(Module *)); num_modules = 0; for (current = 0; current < max_modules; current++) { modp = module_code(current, code_ix); if (modp->curr.code_hdr) { max_funcs += modp->curr.code_hdr->num_functions; module[num_modules++] = modp; } } f->matching = (BpFunction *) Alloc(max_funcs*sizeof(BpFunction)); i = 0; for (current = 0; current < num_modules; current++) { BeamCodeHeader* code_hdr = module[current]->curr.code_hdr; BeamInstr* code; Uint num_functions = (Uint)(UWord) code_hdr->num_functions; Uint fi; if (specified > 0) { if (mfa[0] != make_atom(module[current]->module)) { /* Wrong module name */ continue; } } for (fi = 0; fi < num_functions; fi++) { BeamInstr* pc; int wi; code = code_hdr->functions[fi]; ASSERT(code[0] == (BeamInstr) BeamOp(op_i_func_info_IaaI)); pc = code+5; if (erts_is_native_break(pc)) { continue; } if (is_nil(code[3])) { /* Ignore BIF stub */ continue; } for (wi = 0; wi < specified && (Eterm) code[2+wi] == mfa[wi]; wi++) { /* Empty loop body */ } if (wi == specified) { /* Store match */ f->matching[i].pc = pc; f->matching[i].mod = module[current]; i++; } } } f->matched = i; Free(module); }
void loaded(int to, void *to_arg) { int i; int old = 0; int cur = 0; BeamInstr* code; Module* modp; ErtsCodeIndex code_ix; code_ix = erts_active_code_ix(); erts_rlock_old_code(code_ix); /* * Calculate and print totals. */ for (i = 0; i < module_code_size(code_ix); i++) { if ((modp = module_code(i, code_ix)) != NULL && ((modp->curr.code_length != 0) || (modp->old.code_length != 0))) { cur += modp->curr.code_length; if (modp->old.code_length != 0) { old += modp->old.code_length; } } } erts_print(to, to_arg, "Current code: %d\n", cur); erts_print(to, to_arg, "Old code: %d\n", old); /* * Print one line per module. */ for (i = 0; i < module_code_size(code_ix); i++) { modp = module_code(i, code_ix); if (!ERTS_IS_CRASH_DUMPING) { /* * Interactive dump; keep it brief. */ if (modp != NULL && ((modp->curr.code_length != 0) || (modp->old.code_length != 0))) { erts_print(to, to_arg, "%T", make_atom(modp->module)); cur += modp->curr.code_length; erts_print(to, to_arg, " %d", modp->curr.code_length ); if (modp->old.code_length != 0) { erts_print(to, to_arg, " (%d old)", modp->old.code_length ); old += modp->old.code_length; } erts_print(to, to_arg, "\n"); } } else { /* * To crash dump; make it parseable. */ if (modp != NULL && ((modp->curr.code_length != 0) || (modp->old.code_length != 0))) { erts_print(to, to_arg, "=mod:"); erts_print(to, to_arg, "%T", make_atom(modp->module)); erts_print(to, to_arg, "\n"); erts_print(to, to_arg, "Current size: %d\n", modp->curr.code_length); code = modp->curr.code; if (code != NULL && code[MI_ATTR_PTR]) { erts_print(to, to_arg, "Current attributes: "); dump_attributes(to, to_arg, (byte *) code[MI_ATTR_PTR], code[MI_ATTR_SIZE]); } if (code != NULL && code[MI_COMPILE_PTR]) { erts_print(to, to_arg, "Current compilation info: "); dump_attributes(to, to_arg, (byte *) code[MI_COMPILE_PTR], code[MI_COMPILE_SIZE]); } if (modp->old.code_length != 0) { erts_print(to, to_arg, "Old size: %d\n", modp->old.code_length); code = modp->old.code; if (code[MI_ATTR_PTR]) { erts_print(to, to_arg, "Old attributes: "); dump_attributes(to, to_arg, (byte *) code[MI_ATTR_PTR], code[MI_ATTR_SIZE]); } if (code[MI_COMPILE_PTR]) { erts_print(to, to_arg, "Old compilation info: "); dump_attributes(to, to_arg, (byte *) code[MI_COMPILE_PTR], code[MI_COMPILE_SIZE]); } } } } } erts_runlock_old_code(code_ix); }
void erts_bp_match_functions(BpFunctions* f, ErtsCodeMFA *mfa, int specified) { ErtsCodeIndex code_ix = erts_active_code_ix(); Uint max_funcs = 0; int current; int max_modules = module_code_size(code_ix); int num_modules = 0; Module* modp; Module** module; Uint i; module = (Module **) Alloc(max_modules*sizeof(Module *)); num_modules = 0; for (current = 0; current < max_modules; current++) { modp = module_code(current, code_ix); if (modp->curr.code_hdr) { max_funcs += modp->curr.code_hdr->num_functions; module[num_modules++] = modp; } } f->matching = (BpFunction *) Alloc(max_funcs*sizeof(BpFunction)); i = 0; for (current = 0; current < num_modules; current++) { BeamCodeHeader* code_hdr = module[current]->curr.code_hdr; ErtsCodeInfo* ci; Uint num_functions = (Uint)(UWord) code_hdr->num_functions; Uint fi; if (specified > 0) { if (mfa->module != make_atom(module[current]->module)) { /* Wrong module name */ continue; } } for (fi = 0; fi < num_functions; fi++) { ci = code_hdr->functions[fi]; ASSERT(ci->op == (BeamInstr) BeamOp(op_i_func_info_IaaI)); if (erts_is_function_native(ci)) { continue; } if (is_nil(ci->mfa.module)) { /* Ignore BIF stub */ continue; } switch (specified) { case 3: if (ci->mfa.arity != mfa->arity) continue; case 2: if (ci->mfa.function != mfa->function) continue; case 1: if (ci->mfa.module != mfa->module) continue; case 0: break; } /* Store match */ f->matching[i].ci = ci; f->matching[i].mod = module[current]; i++; } } f->matched = i; Free(module); }