/* * Class: sun_jvm_hotspot_debugger_proc_ProcDebuggerLocal * Method: writeBytesToProcess0 * Signature: (JJ[B)V * Description: write bytes into debugger process */ JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_proc_ProcDebuggerLocal_writeBytesToProcess0 (JNIEnv *env, jobject this_obj, jlong address, jlong numBytes, jbyteArray data) { jlong p_ps_prochandle = env->GetLongField(this_obj, p_ps_prochandle_ID); jboolean isCopy; jbyte* ptr = env->GetByteArrayElements(data, &isCopy); CHECK_EXCEPTION; if (ps_pwrite((struct ps_prochandle*) p_ps_prochandle, address, ptr, numBytes) != PS_OK) { env->ReleaseByteArrayElements(data, ptr, JNI_ABORT); THROW_NEW_DEBUGGER_EXCEPTION("Process write failed!"); } env->ReleaseByteArrayElements(data, ptr, JNI_ABORT); }
static td_err_e pt_ta_delete(td_thragent_t *ta) { int dbg; TDBG_FUNC(); dbg = 0; /* * Error returns from this write are not really a problem; * the process doesn't exist any more. */ ps_pwrite(ta->ph, ta->libthr_debug_addr, &dbg, sizeof(int)); free(ta); return (TD_OK); }
static td_err_e pt_ta_new(struct ps_prochandle *ph, td_thragent_t **pta) { #define LOOKUP_SYM(proc, sym, addr) \ ret = ps_pglobal_lookup(proc, NULL, sym, addr); \ if (ret != 0) { \ TDBG("can not find symbol: %s\n", sym); \ ret = TD_NOLIBTHREAD; \ goto error; \ } #define LOOKUP_VAL(proc, sym, val) \ ret = ps_pglobal_lookup(proc, NULL, sym, &vaddr);\ if (ret != 0) { \ TDBG("can not find symbol: %s\n", sym); \ ret = TD_NOLIBTHREAD; \ goto error; \ } \ ret = ps_pread(proc, vaddr, val, sizeof(int)); \ if (ret != 0) { \ TDBG("can not read value of %s\n", sym);\ ret = TD_NOLIBTHREAD; \ goto error; \ } td_thragent_t *ta; psaddr_t vaddr; int dbg; int ret; TDBG_FUNC(); ta = malloc(sizeof(td_thragent_t)); if (ta == NULL) return (TD_MALLOC); ta->ph = ph; LOOKUP_SYM(ph, "_libthr_debug", &ta->libthr_debug_addr); LOOKUP_SYM(ph, "_thread_list", &ta->thread_list_addr); LOOKUP_SYM(ph, "_thread_active_threads",&ta->thread_active_threads_addr); LOOKUP_SYM(ph, "_thread_keytable", &ta->thread_keytable_addr); LOOKUP_SYM(ph, "_thread_last_event", &ta->thread_last_event_addr); LOOKUP_SYM(ph, "_thread_event_mask", &ta->thread_event_mask_addr); LOOKUP_SYM(ph, "_thread_bp_create", &ta->thread_bp_create_addr); LOOKUP_SYM(ph, "_thread_bp_death", &ta->thread_bp_death_addr); LOOKUP_VAL(ph, "_thread_off_dtv", &ta->thread_off_dtv); LOOKUP_VAL(ph, "_thread_off_tlsindex", &ta->thread_off_tlsindex); LOOKUP_VAL(ph, "_thread_off_attr_flags", &ta->thread_off_attr_flags); LOOKUP_VAL(ph, "_thread_size_key", &ta->thread_size_key); LOOKUP_VAL(ph, "_thread_off_tcb", &ta->thread_off_tcb); LOOKUP_VAL(ph, "_thread_off_tid", &ta->thread_off_tid); LOOKUP_VAL(ph, "_thread_off_linkmap", &ta->thread_off_linkmap); LOOKUP_VAL(ph, "_thread_off_next", &ta->thread_off_next); LOOKUP_VAL(ph, "_thread_off_state", &ta->thread_off_state); LOOKUP_VAL(ph, "_thread_max_keys", &ta->thread_max_keys); LOOKUP_VAL(ph, "_thread_off_key_allocated", &ta->thread_off_key_allocated); LOOKUP_VAL(ph, "_thread_off_key_destructor", &ta->thread_off_key_destructor); LOOKUP_VAL(ph, "_thread_state_running", &ta->thread_state_running); LOOKUP_VAL(ph, "_thread_state_zoombie", &ta->thread_state_zoombie); LOOKUP_VAL(ph, "_thread_off_report_events", &ta->thread_off_report_events); LOOKUP_VAL(ph, "_thread_off_event_mask", &ta->thread_off_event_mask); LOOKUP_VAL(ph, "_thread_off_event_buf", &ta->thread_off_event_buf); dbg = getpid(); /* * If this fails it probably means we're debugging a core file and * can't write to it. */ ps_pwrite(ph, ta->libthr_debug_addr, &dbg, sizeof(int)); *pta = ta; return (0); error: free(ta); return (ret); }