static ptid_t thread_to_lwp (ptid_t thread_id, int default_lwp) { td_thrinfo_t ti; td_thrhandle_t th; td_err_e val; if (is_lwp (thread_id)) return thread_id; /* It's already an LWP id */ /* It's a thread. Convert to lwp */ val = p_td_ta_map_id2thr (main_ta, GET_THREAD (thread_id), &th); if (val == TD_NOTHR) return pid_to_ptid (-1); /* thread must have terminated */ else if (val != TD_OK) error ("thread_to_lwp: td_ta_map_id2thr %s", td_err_string (val)); val = p_td_thr_get_info (&th, &ti); if (val == TD_NOTHR) return pid_to_ptid (-1); /* thread must have terminated */ else if (val != TD_OK) error ("thread_to_lwp: td_thr_get_info: %s", td_err_string (val)); if (ti.ti_state != TD_THR_ACTIVE) { if (default_lwp != -1) return pid_to_ptid (default_lwp); error ("thread_to_lwp: thread state not active: %s", td_state_string (ti.ti_state)); } return BUILD_LWP (ti.ti_lid, PIDGET (thread_id)); }
static int sol_find_new_threads_callback (const td_thrhandle_t *th, void *ignored) { td_err_e retval; td_thrinfo_t ti; ptid_t ptid; if ((retval = p_td_thr_get_info (th, &ti)) != TD_OK) { return -1; } ptid = BUILD_THREAD (ti.ti_tid, PIDGET (inferior_ptid)); if (!in_thread_list (ptid)) add_thread (ptid); return 0; }
static int fill_thread_list(const td_thrhandle_t *p_td_thragent_t, void* cd) { DebuggerWithObject* dbgo = (DebuggerWithObject*) cd; JNIEnv* env = dbgo->env; jobject this_obj = dbgo->this_obj; jobject list = dbgo->obj; td_thrinfo_t thrinfo; p_td_thr_get_info_t p_td_thr_get_info = (p_td_thr_get_info_t) env->GetLongField(this_obj, p_td_thr_get_info_ID); if (p_td_thr_get_info(p_td_thragent_t, &thrinfo) != TD_OK) return (0); jobject threadProxy = env->CallObjectMethod(this_obj, getThreadForThreadId_ID, (jlong)(uintptr_t) thrinfo.ti_tid); CHECK_EXCEPTION_(1); env->CallBooleanMethod(list, listAdd_ID, threadProxy); CHECK_EXCEPTION_(1); return 0; }
static int thr_stack(const td_thrhandle_t *Thp, void *cd) { Debugger* pDebugger = (Debugger*) cd; JNIEnv* env = pDebugger->env; jobject this_obj = pDebugger->obj; td_thrinfo_t thrinfo; p_td_thr_get_info_t p_td_thr_get_info = (p_td_thr_get_info_t) env->GetLongField(this_obj, p_td_thr_get_info_ID); if (p_td_thr_get_info(Thp, &thrinfo) != TD_OK) return (0); prgregset_t regs; (void) memset(regs, 0, sizeof (prgregset_t)); p_td_thr_getgregs_t p_td_thr_getgregs = (p_td_thr_getgregs_t) env->GetLongField(this_obj, p_td_thr_getgregs_ID); (void) p_td_thr_getgregs(Thp, regs); jlongArray regSetArray = env->NewLongArray(NPRGREG); CHECK_EXCEPTION_(0); jboolean isCopy; jlong* ptrRes = env->GetLongArrayElements(regSetArray, &isCopy); CHECK_EXCEPTION_(0); // copy the reg set for(int c = 0; c < NPRGREG; c++) ptrRes[c] = (jlong) (uintptr_t) regs[c]; env->ReleaseLongArrayElements(regSetArray, ptrRes, JNI_COMMIT); env->CallVoidMethod(pDebugger->obj, setThreadIntegerRegisterSet_ID, thrinfo.ti_tid, regSetArray); CHECK_EXCEPTION_(0); return (0); }
static ptid_t lwp_to_thread (ptid_t lwp) { td_thrinfo_t ti; td_thrhandle_t th; td_err_e val; if (is_thread (lwp)) return lwp; /* It's already a thread id */ /* It's an lwp. Convert it to a thread id. */ if (!sol_thread_alive (lwp)) return pid_to_ptid (-1); /* defunct lwp */ val = p_td_ta_map_lwp2thr (main_ta, GET_LWP (lwp), &th); if (val == TD_NOTHR) return pid_to_ptid (-1); /* thread must have terminated */ else if (val != TD_OK) error ("lwp_to_thread: td_ta_map_lwp2thr: %s.", td_err_string (val)); val = p_td_thr_validate (&th); if (val == TD_NOTHR) return lwp; /* libthread doesn't know about it; just return lwp */ else if (val != TD_OK) error ("lwp_to_thread: td_thr_validate: %s.", td_err_string (val)); val = p_td_thr_get_info (&th, &ti); if (val == TD_NOTHR) return pid_to_ptid (-1); /* thread must have terminated */ else if (val != TD_OK) error ("lwp_to_thread: td_thr_get_info: %s.", td_err_string (val)); return BUILD_THREAD (ti.ti_tid, PIDGET (lwp)); }
static int info_cb (const td_thrhandle_t *th, void *s) { td_err_e ret; td_thrinfo_t ti; if ((ret = p_td_thr_get_info (th, &ti)) == TD_OK) { printf_filtered ("%s thread #%d, lwp %d, ", ti.ti_type == TD_THR_SYSTEM ? "system" : "user ", ti.ti_tid, ti.ti_lid); switch (ti.ti_state) { default: case TD_THR_UNKNOWN: printf_filtered ("<unknown state>"); break; case TD_THR_STOPPED: printf_filtered ("(stopped)"); break; case TD_THR_RUN: printf_filtered ("(run) "); break; case TD_THR_ACTIVE: printf_filtered ("(active) "); break; case TD_THR_ZOMBIE: printf_filtered ("(zombie) "); break; case TD_THR_SLEEP: printf_filtered ("(asleep) "); break; case TD_THR_STOPPED_ASLEEP: printf_filtered ("(stopped asleep)"); break; } /* Print thr_create start function: */ if (ti.ti_startfunc != 0) { struct minimal_symbol *msym; msym = lookup_minimal_symbol_by_pc (ti.ti_startfunc); if (msym) printf_filtered (" startfunc: %s\n", DEPRECATED_SYMBOL_NAME (msym)); else printf_filtered (" startfunc: 0x%s\n", paddr (ti.ti_startfunc)); } /* If thread is asleep, print function that went to sleep: */ if (ti.ti_state == TD_THR_SLEEP) { struct minimal_symbol *msym; msym = lookup_minimal_symbol_by_pc (ti.ti_pc); if (msym) printf_filtered (" - Sleep func: %s\n", DEPRECATED_SYMBOL_NAME (msym)); else printf_filtered (" - Sleep func: 0x%s\n", paddr (ti.ti_startfunc)); } /* Wrap up line, if necessary */ if (ti.ti_state != TD_THR_SLEEP && ti.ti_startfunc == 0) printf_filtered ("\n"); /* don't you hate counting newlines? */ } else warning ("info sol-thread: failed to get info for thread."); return 0; }