void kmdb_dpi_process_work_queue(void) { work_results_t res; (void) mdb_nv_create(&res.res_loads, UM_SLEEP); (void) mdb_nv_create(&res.res_unloads, UM_SLEEP); mdb_dprintf(MDB_DBG_DPI, "processing work queue\n"); (void) kmdb_wr_debugger_process(kmdb_dbgnotify_cb, &res); if (mdb_nv_size(&res.res_loads)) { mdb_printf("Loaded modules: ["); print_modules(&res.res_loads); mdb_printf(" ]\n"); } if (mdb_nv_size(&res.res_unloads)) { mdb_printf("Unloaded modules: ["); print_modules(&res.res_unloads); mdb_printf(" ]\n"); } mdb_nv_destroy(&res.res_loads); mdb_nv_destroy(&res.res_unloads); }
int kt_lookup_by_name(mdb_tgt_t *t, const char *obj, const char *name, GElf_Sym *symp, mdb_syminfo_t *sip) { kt_data_t *kt = t->t_data; kt_module_t *km, kmod; mdb_var_t *v; int n; /* * To simplify the implementation, we create a fake module on the stack * which is "prepended" to k_modlist and whose symtab is kt->k_symtab. */ kmod.km_symtab = kt->k_symtab; kmod.km_list.ml_next = mdb_list_next(&kt->k_modlist); switch ((uintptr_t)obj) { case (uintptr_t)MDB_TGT_OBJ_EXEC: km = &kmod; n = 1; break; case (uintptr_t)MDB_TGT_OBJ_EVERY: km = &kmod; n = mdb_nv_size(&kt->k_modules) + 1; break; case (uintptr_t)MDB_TGT_OBJ_RTLD: obj = KT_RTLD_NAME; /*FALLTHRU*/ default: if ((v = mdb_nv_lookup(&kt->k_modules, obj)) == NULL) return (set_errno(EMDB_NOOBJ)); km = mdb_nv_get_cookie(v); n = 1; if (km->km_symtab == NULL) kt_load_module(kt, t, km); } for (; n > 0; n--, km = mdb_list_next(km)) { if (mdb_gelf_symtab_lookup_by_name(km->km_symtab, name, symp, &sip->sym_id) == 0) { sip->sym_table = MDB_TGT_SYMTAB; return (0); } } return (set_errno(EMDB_NOSYM)); }
size_t mdb_tab_size(mdb_tab_cookie_t *mcp) { return (mdb_nv_size(&mcp->mtc_nv)); }