24#include "gdbsupport/gdb_vecs.h"
49#include "gdbsupport/pathstuff.h"
82 N_(
"multi-threaded child process."),
83 N_(
"Threads and pthreads support.")
96 void resume (ptid_t,
int,
enum gdb_signal)
override;
102 CORE_ADDR load_module_addr,
103 CORE_ADDR offset)
override;
129 gdb_printf (file, _(
"Auto-loading of inferior specific libthread_db "
237 info->need_stale_parent_threads_check = 1;
254 if (targ == info->process_target &&
pid == info->pid)
274 for (info =
thread_db_list; info; info_prev = info, info = info->next)
275 if (targ == info->process_target &&
pid == info->pid)
281 if (info->thread_agent != NULL && info->td_ta_delete_p != NULL)
283 td_err_e err = info->td_ta_delete_p (info->thread_agent);
286 warning (_(
"Cannot deregister process %d from libthread_db: %s"),
288 info->thread_agent = NULL;
291 if (info->handle != NULL)
292 dlclose (info->handle);
294 xfree (info->filename);
297 info_prev->
next = info->next;
321 return gdb::checked_static_cast<thread_db_thread_info *> (thread->
priv.get ());
332 return "generic 'call succeeded'";
334 return "generic error";
336 return "no thread to satisfy query";
338 return "no sync handle to satisfy query";
340 return "no LWP to satisfy query";
342 return "invalid process handle";
344 return "invalid thread handle";
346 return "invalid synchronization handle";
348 return "invalid thread agent";
350 return "invalid key";
352 return "no event message for getmsg";
354 return "FPU register set not available";
356 return "application not linked with libthread";
358 return "requested event is not supported";
360 return "capability not available";
362 return "debugger service failed";
364 return "operation not applicable to";
366 return "no thread-specific data for this thread";
368 return "malloc failed";
370 return "only part of register set was written/read";
372 return "X register set not available for this thread";
373#ifdef THREAD_DB_HAS_TD_NOTALLOC
375 return "thread has not yet allocated TLS for given module";
377#ifdef THREAD_DB_HAS_TD_VERSION
379 return "versions of libpthread and libthread_db do not match";
381#ifdef THREAD_DB_HAS_TD_NOTLS
383 return "there is no TLS segment in the given module";
386 snprintf (buf,
sizeof (buf),
"unknown thread_db error '%d'",
err);
408 gdb_assert (ptid.lwp () != 0);
413 info->proc_handle.thread = stopped;
414 err = info->td_ta_map_lwp2thr_p (info->thread_agent, ptid.lwp (),
417 error (_(
"Cannot find user-level thread for LWP %ld: %s"),
420 err = info->td_thr_get_info_p (&th, &ti);
422 error (_(
"thread_get_info_callback: cannot get thread info: %s"),
458 warning (_(
"Symbol \"%s\" not found in libthread_db: %s"),
471 CORE_ADDR version_addr;
475 if (version_msym.
minsym == NULL)
479 gdb::unique_xmalloc_ptr<char>
version
486 retval = (sscanf (
version.get (),
"%d.%d", &major, &minor) == 2
487 && (major < ver_major_min
488 || (major == ver_major_min && minor < ver_minor_min)));
509 catch (
const gdb_exception_error &except)
513 "Warning: thread_db_find_new_threads_silently: ");
534 _(
"Warning: couldn't activate thread debugging "
535 "using libthread_db: "));
552 if (dladdr (addr, &info) != 0)
553 return info.dli_fname;
587#define LOG(fmt, args...) \
590 if (tdb_testinfo->log_progress) \
592 debug_printf (fmt, ## args); \
593 gdb_flush (gdb_stdlog); \
598#define CHECK_1(expr, args...) \
603 LOG (" ... FAIL!\n"); \
610 CHECK_1 (expr, "(%s) == false", #expr)
612#define CALL_UNCHECKED(func, args...) \
615 tdb_testinfo->last_call = #func; \
616 tdb_testinfo->last_result \
617 = tdb_testinfo->info->func ## _p (args); \
621#define CHECK_CALL() \
622 CHECK_1 (tdb_testinfo->last_result == TD_OK, \
623 _("%s failed: %s"), \
624 tdb_testinfo->last_call, \
625 thread_db_err_str (tdb_testinfo->last_result)) \
627#define CALL(func, args...) \
630 CALL_UNCHECKED (func, args); \
642 LOG (
" %s", core_addr_to_string_nz ((CORE_ADDR) th->
th_unique));
661 LOG (_(
"; can't map_lwp2thr"));
667 LOG (
" => %s", core_addr_to_string_nz ((CORE_ADDR) th2.
th_unique));
730 bool test_passed =
true;
733 debug_printf (_(
"Running libthread_db integrity checks:\n"));
739 if (td_ta_thr_iter_p == NULL)
741 void *thr_iter =
verbose_dlsym (info->handle,
"td_ta_thr_iter");
742 if (thr_iter == NULL)
777 error (_(
"no threads seen"));
779 catch (
const gdb_exception_error &except)
785 _(
"libthread_db integrity checks failed: "));
791 debug_printf (_(
"libthread_db integrity checks passed.\n"));
815 obj).minsym != NULL);
832#define TDB_VERBOSE_DLSYM(info, func) \
833 info->func ## _p = (func ## _ftype *) verbose_dlsym (info->handle, #func)
835#define TDB_DLSYM(info, func) \
836 info->func ## _p = (func ## _ftype *) dlsym (info->handle, #func)
850 warning (_(
"Cannot initialize libthread_db: %s"),
871#ifdef THREAD_DB_HAS_TD_VERSION
908#undef TDB_VERBOSE_DLSYM
927 if (lp->ptid.pid () ==
pid)
940 gdb_printf (_(
"[Thread debugging using libthread_db enabled]\n"));
950 gdb_printf (_(
"Using host libthread_db library \"%ps\".\n"),
971 _(
"Trying host libthread_db library: %s.\n"),
974 if (check_auto_load_safe)
976 if (access (library, R_OK) != 0)
982 safe_strerror (errno));
987 (
"Loading libthread-db library \"%s\" from explicit directory.",
994 handle = dlopen (library, RTLD_NOW);
1011 if (libpath != NULL)
1020 if (strchr (library,
'/') != NULL)
1021 info->filename = gdb_realpath (library).release ();
1028 catch (
const gdb_exception_error &except)
1032 "Warning: While trying to load libthread_db: ");
1051 if (obj_name[0] !=
'/')
1053 warning (_(
"Expected absolute pathname for libpthread in the"
1054 " inferior, but got %ps."),
1059 std::string path = obj_name;
1060 size_t cp = path.rfind (
'/');
1062 gdb_assert (cp != std::string::npos);
1063 path.resize (cp + 1);
1065 path = path + subdir +
"/";
1091 if (obj->separate_debug_objfile_backlink != NULL)
1121 std::string path = std::string (dir, dir_len) +
"/" +
LIBTHREAD_DB_SO;
1135 std::vector<gdb::unique_xmalloc_ptr<char>> dir_vec
1138 for (
const gdb::unique_xmalloc_ptr<char> &this_dir_up : dir_vec)
1140 const char *this_dir = this_dir_up.get ();
1141 const int pdir_len =
sizeof (
"$pdir") - 1;
1142 size_t this_dir_len;
1144 this_dir_len = strlen (this_dir);
1146 if (strncmp (this_dir,
"$pdir", pdir_len) == 0
1147 && (this_dir[pdir_len] ==
'\0'
1148 || this_dir[pdir_len] ==
'/'))
1150 const char *subdir = NULL;
1152 std::string subdir_holder;
1153 if (this_dir[pdir_len] ==
'/')
1155 subdir_holder = std::string (this_dir + pdir_len + 1);
1156 subdir = subdir_holder.c_str ();
1162 else if (strcmp (this_dir,
"$sdir") == 0)
1182 _(
"thread_db_load_search returning %d\n"), rc);
1208 if (
inf->in_initial_library_scan)
1233 warning (_(
"Unable to find libthread_db matching inferior's thread"
1234 " library, thread debugging will not be available."));
1313 warning (_ (
"Target and debugger are in different PID "
1314 "namespaces; thread lists and other data are "
1315 "likely unreliable. "
1316 "Connect to gdbserver inside the container."));
1372 tp->
priv.reset (priv);
1390 inf->unpush_target (
this);
1395 target_wait_flags options)
1404 switch (ourstatus->
kind ())
1442 const char *execd_pathname)
1468 err = info->td_thr_get_info_p (th_p, &ti);
1470 error (_(
"find_new_threads_callback: cannot get thread info: %s"),
1483 "thread_db: skipping exited and "
1484 "joined thread (0x%lx)\n",
1485 (
unsigned long) ti.
ti_tid);
1498 info->need_stale_parent_threads_check = 0;
1506 if (info->need_stale_parent_threads_check)
1510 if (tgid != -1 && tgid != info->pid)
1514 ptid_t ptid (info->pid, ti.
ti_lid);
1515 tp = info->process_target->find_thread (ptid);
1516 if (tp == NULL || tp->
priv == NULL)
1533 data.new_threads = 0;
1549 catch (
const gdb_exception_error &except)
1554 "Warning: find_new_threads_once: ");
1561 _(
"Found %d new threads in iteration %d.\n"),
1562 data.new_threads, iteration);
1568 return data.new_threads;
1583 stopped->
ptid.pid ());
1586 info->proc_handle.thread = stopped;
1594 for (i = 0, loop = 0; loop < 4 &&
err ==
TD_OK; ++i, ++loop)
1632 if (thread == NULL || thread->
executing ())
1665 return string_printf (
"Thread 0x%lx (LWP %ld)",
1666 (
unsigned long) priv->
tid, ptid.lwp ());
1678 if (
info->priv == NULL)
1706 if (handle_len == 4 &&
sizeof (handle_tid) == 8)
1707 handle_tid = (
thread_t) * (
const uint32_t *) thread_handle;
1708 else if (handle_len ==
sizeof (handle_tid))
1709 handle_tid = * (
const thread_t *) thread_handle;
1711 error (_(
"Thread handle size mismatch: %d vs %zu (from libthread_db)"),
1712 handle_len,
sizeof (handle_tid));
1718 if (priv != NULL && handle_tid == priv->
tid)
1727gdb::array_view<const gdb_byte>
1735 int handle_size =
sizeof (priv->
tid);
1772 if (!
info->td_thr_tls_get_addr_p)
1773 throw_error (TLS_NO_LIBRARY_SUPPORT_ERROR,
1774 _(
"No TLS library support"));
1779 err =
info->td_thr_tls_get_addr_p (&priv->
th,
1780 (psaddr_t)(uintptr_t) lm,
1787 if (!
info->td_thr_tlsbase_p)
1788 throw_error (TLS_LOAD_MODULE_NOT_FOUND_ERROR,
1789 _(
"TLS load module not found"));
1797 err =
info->td_thr_tlsbase_p (&priv->
th, 1, &address);
1798 address = (
char *) address + offset;
1801#ifdef THREAD_DB_HAS_TD_NOTALLOC
1807 throw_error (TLS_NOT_ALLOCATED_YET_ERROR,
1808 _(
"TLS not allocated yet"));
1813 throw_error (TLS_GENERIC_ERROR,
1820 ? (CORE_ADDR) (intptr_t) address
1821 : (CORE_ADDR) (uintptr_t) address);
1851 info->need_stale_parent_threads_check = 0;
1879 const char *cs = args ? args :
"";
1881 unsigned unique_filenames;
1882 size_t max_filename_len, pids_len;
1885 cs = skip_spaces (cs);
1887 error (_(
"'info auto-load libthread-db' does not accept any parameters"));
1889 std::vector<struct thread_db_info *> array;
1891 if (info->filename != NULL)
1892 array.push_back (info);
1895 std::sort (array.begin (), array.end (),
1901 unique_filenames = 0;
1902 max_filename_len = 0;
1904 for (i = 0; i < array.size (); i++)
1906 int pid = array[i]->pid;
1907 size_t this_pid_len;
1909 for (this_pid_len = 0;
pid != 0;
pid /= 10)
1915 max_filename_len = std::max (max_filename_len,
1919 pids_len -= strlen (
", ");
1922 pids_len += this_pid_len + strlen (
", ");
1925 pids_len -= strlen (
", ");
1934 "LinuxThreadDbTable");
1941 for (i = 0; i < array.size ();)
1950 while (i < array.size () && strcmp (info->filename,
1951 array[i]->filename) == 0)
1955 string_appendf (
pids,
"%u", array[i]->
pid);
1966 uiout->
message (_(
"No auto-loaded libthread-db.\n"));
1977 if (inferior_pid == 0)
1978 error (_(
"No inferior running"));
1983 error (_(
"No libthread_db loaded"));
2001Set search path for libthread_db."), _(
"\
2002Show the current search path or libthread_db."), _(
"\
2003This path is used to search for libthread_db to be loaded into \
2005Its value is a colon (':') separate list of directories to search.\n\
2006Setting the search path to an empty list resets it to its default value."),
2013Set libthread-db debugging."), _(
"\
2014Show libthread-db debugging."), _(
"\
2015When non-zero, libthread-db debugging is enabled."),
2022Enable or disable auto-loading of inferior specific libthread_db."), _(
"\
2023Show whether auto-loading inferior specific libthread_db is enabled."), _(
"\
2024If enabled, libthread_db will be searched in 'set libthread-db-search-path'\n\
2025locations to load libthread_db compatible with the inferior.\n\
2026Standard system libthread_db still gets loaded even with this option off.\n\
2027This option has security implications for untrusted inferiors."),
2033 _(
"Print the list of loaded inferior specific libthread_db.\n\
2034Usage: info auto-load libthread-db"),
2039Run integrity checks on the current inferior's libthread_db."),
2045Set whether to check libthread_db at load time."), _(
"\
2046Show whether to check libthread_db at load time."), _(
"\
2047If enabled GDB will run integrity checks on inferior specific libthread_db\n\
2048as they are loaded."),
bool file_is_auto_load_safe(const char *filename)
struct cmd_list_element ** auto_load_info_cmdlist_get(void)
char auto_load_info_scripts_pattern_nl[]
struct cmd_list_element ** auto_load_set_cmdlist_get(void)
struct cmd_list_element ** auto_load_show_cmdlist_get(void)
#define auto_load_debug_printf(fmt,...)
ui_file_style style() const
thread_info * find_thread(ptid_t ptid)
int unpush_target(struct target_ops *t)
void push_target(struct target_ops *t)
struct process_stratum_target * process_target()
thread_info * find_thread(ptid_t ptid)
gdb::array_view< const gdb_byte > thread_info_to_thread_handle(struct thread_info *) override
const char * extra_thread_info(struct thread_info *) override
void resume(ptid_t, int, enum gdb_signal) override
std::string pid_to_str(ptid_t) override
void detach(inferior *, int) override
void follow_exec(inferior *, ptid_t, const char *) override
const target_info & info() const override
void update_thread_list() override
void mourn_inferior() override
ptid_t wait(ptid_t, struct target_waitstatus *, target_wait_flags) override
ptid_t get_ada_task_ptid(long lwp, ULONGEST thread) override
CORE_ADDR get_thread_local_address(ptid_t ptid, CORE_ADDR load_module_addr, CORE_ADDR offset) override
strata stratum() const override
thread_info * thread_handle_to_thread_info(const gdb_byte *thread_handle, int handle_len, inferior *inf) override
private_thread_info_up priv
void field_string(const char *fldname, const char *string, const ui_file_style &style=ui_file_style())
void text(const char *string)
void table_header(int width, ui_align align, const std::string &col_name, const std::string &col_hdr)
void message(const char *format,...) ATTRIBUTE_PRINTF(2
struct cmd_list_element * showlist
struct cmd_list_element * maintenancechecklist
struct cmd_list_element * setlist
struct cmd_list_element * showdebuglist
struct cmd_list_element * setdebuglist
struct cmd_list_element * maintenance_show_cmdlist
struct cmd_list_element * maintenance_set_cmdlist
struct cmd_list_element * add_cmd(const char *name, enum command_class theclass, const char *doc, struct cmd_list_element **list)
set_show_commands add_setshow_optional_filename_cmd(const char *name, enum command_class theclass, std::string *var, const char *set_doc, const char *show_doc, const char *help_doc, cmd_func_ftype *set_func, show_value_ftype *show_func, struct cmd_list_element **set_list, struct cmd_list_element **show_list)
set_show_commands add_setshow_boolean_cmd(const char *name, enum command_class theclass, bool *var, const char *set_doc, const char *show_doc, const char *help_doc, cmd_func_ftype *set_func, show_value_ftype *show_func, struct cmd_list_element **set_list, struct cmd_list_element **show_list)
set_show_commands add_setshow_zuinteger_cmd(const char *name, enum command_class theclass, unsigned int *var, const char *set_doc, const char *show_doc, const char *help_doc, cmd_func_ftype *set_func, show_value_ftype *show_func, struct cmd_list_element **set_list, struct cmd_list_element **show_list)
cli_style_option file_name_style
void exception_fprintf(struct ui_file *file, const struct gdb_exception &e, const char *prefix,...)
std::unique_ptr< expression > expression_up
expression_up parse_expression(const char *, innermost_block_tracker *=nullptr, parser_flags flags=0)
td_err_e td_thr_get_info_ftype(const td_thrhandle_t *th, td_thrinfo_t *infop)
td_err_e td_ta_thr_iter_ftype(const td_thragent_t *ta, td_thr_iter_f *callback, void *cbdata_p, td_thr_state_e state, int ti_pri, sigset_t *ti_sigmask_p, unsigned int ti_user_flags)
td_err_e td_ta_map_lwp2thr_ftype(const td_thragent_t *ta, lwpid_t lwpid, td_thrhandle_t *th)
#define LIBTHREAD_DB_SEARCH_PATH
td_err_e td_thr_tlsbase_ftype(const td_thrhandle_t *th, unsigned long int modid, psaddr_t *base)
td_err_e td_init_ftype(void)
td_err_e td_ta_new_ftype(struct ps_prochandle *ps, td_thragent_t **ta)
td_err_e td_thr_tls_get_addr_ftype(const td_thrhandle_t *th, psaddr_t map_address, size_t offset, psaddr_t *address)
td_err_e td_ta_delete_ftype(td_thragent_t *ta_p)
struct thread_info * any_live_thread_of_inferior(inferior *inf)
struct thread_info * inferior_thread(void)
void switch_to_thread(struct thread_info *thr)
std::unique_ptr< private_thread_info > private_thread_info_up
struct thread_info * add_thread_with_info(process_stratum_target *targ, ptid_t ptid, private_thread_info_up)
#define TD_THR_LOWEST_PRIORITY
td_err_e td_ta_new(struct ps_prochandle *__ps, td_thragent_t **__ta)
struct td_thragent td_thragent_t
td_err_e td_ta_thr_iter(const td_thragent_t *__ta, td_thr_iter_f *__callback, void *__cbdata_p, td_thr_state_e __state, int __ti_pri, sigset_t *__ti_sigmask_p, unsigned int __ti_user_flags)
td_err_e td_ta_map_lwp2thr(const td_thragent_t *__ta, lwpid_t __lwpid, td_thrhandle_t *__th)
#define TD_THR_ANY_USER_FLAGS
td_err_e td_thr_tls_get_addr(const td_thrhandle_t *__th, psaddr_t __map_address, size_t __offset, psaddr_t *__address)
td_err_e td_thr_tlsbase(const td_thrhandle_t *__th, unsigned long int __modid, psaddr_t *__base)
td_err_e td_ta_delete(td_thragent_t *__ta)
td_err_e td_thr_get_info(const td_thrhandle_t *__th, td_thrinfo_t *__infop)
mach_port_t kern_return_t mach_port_t mach_msg_type_name_t msgportsPoly mach_port_t kern_return_t pid_t pid mach_port_t kern_return_t mach_port_t task mach_port_t kern_return_t int const_procinfo_t mach_msg_type_number_t const_data_t mach_msg_type_number_t threadwaitsCnt mach_port_t kern_return_t const_data_t mach_msg_type_number_t procenvCnt mach_port_t kern_return_t const_pidarray_t pids
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t err
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t int int rusage_t pid_t pid
struct inferior * current_inferior(void)
all_inferiors_range all_inferiors(process_stratum_target *proc_target=nullptr)
int signal_print_update(int signo, int state)
int signal_stop_update(int signo, int state)
int linux_ns_same(pid_t pid, enum linux_ns_type type)
void linux_unstop_all_lwps(void)
int lin_thread_get_thread_signal(unsigned int i)
lwp_info_range all_lwps()
unsigned int lin_thread_get_thread_signal_num(void)
struct linux_nat_target * linux_target
void linux_stop_and_wait_all_lwps(void)
int linux_proc_get_tgid(pid_t lwpid)
int linux_proc_task_list_dir_exists(pid_t pid)
static bool check_thread_db_on_load
static thread_db_target the_thread_db_target
static unsigned int libthread_db_debug
static const char * thread_db_err_str(td_err_e err)
static void thread_db_new_objfile(struct objfile *objfile)
static void maintenance_check_libthread_db(const char *args, int from_tty)
static void thread_db_find_new_threads_2(thread_info *stopped, bool until_no_new)
static thread_db_info * thread_db_list
static bool thread_db_load(void)
static bool try_thread_db_load_from_sdir(void)
static struct check_thread_db_info * tdb_testinfo
static void thread_db_find_new_threads_1(thread_info *stopped)
static void delete_thread_db_info(process_stratum_target *targ, int pid)
static int check_thread_db_callback(const td_thrhandle_t *th, void *arg)
static bool check_thread_db(struct thread_db_info *info, bool log_progress)
static void check_thread_signals(void)
static std::string libthread_db_search_path
static const char * dladdr_to_soname(const void *addr)
static bool libpthread_objfile_p(objfile *obj)
static int thread_signals
#define LOG(fmt, args...)
static struct thread_db_info * add_thread_db_info(void *handle)
static int find_new_threads_once(struct thread_db_info *info, int iteration, td_err_e *errp)
static bool try_thread_db_load_from_dir(const char *dir, size_t dir_len)
static void show_libthread_db_debug(struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value)
int thread_db_notice_clone(ptid_t parent, ptid_t child)
static void info_auto_load_libthread_db(const char *args, int from_tty)
static bool try_thread_db_load_from_pdir(const char *subdir)
static bool try_thread_db_load_from_pdir_1(struct objfile *obj, const char *subdir)
static bool info_auto_load_libthread_db_compare(const struct thread_db_info *a, const struct thread_db_info *b)
static const target_info thread_db_target_info
static int thread_db_find_new_threads_silently(thread_info *stopped)
static bool try_thread_db_load(const char *library, bool check_auto_load_safe)
#define TDB_DLSYM(info, func)
static void check_for_thread_db(void)
static void thread_db_inferior_created(inferior *inf)
static void update_thread_state(thread_db_thread_info *priv, const td_thrinfo_t *ti_p)
static struct thread_info * record_thread(struct thread_db_info *info, struct thread_info *tp, ptid_t ptid, const td_thrhandle_t *th_p, const td_thrinfo_t *ti_p)
static void set_libthread_db_search_path(const char *ignored, int from_tty, struct cmd_list_element *c)
#define CALL(func, args...)
void _initialize_thread_db()
static bool auto_load_thread_db
static struct thread_info * thread_from_lwp(thread_info *stopped, ptid_t ptid)
static void check_pid_namespace_match(inferior *inf)
static void * verbose_dlsym(void *handle, const char *name)
static thread_db_thread_info * get_thread_db_thread_info(thread_info *thread)
static struct thread_db_info * get_thread_db_info(process_stratum_target *targ, int pid)
#define TDB_VERBOSE_DLSYM(info, func)
static bool has_libpthread(void)
static bool try_thread_db_load_1(struct thread_db_info *info)
static void show_auto_load_thread_db(struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value)
static int inferior_has_bug(const char *ver_symbol, int ver_major_min, int ver_minor_min)
static bool thread_db_load_search(void)
#define CALL_UNCHECKED(func, args...)
static int find_new_threads_callback(const td_thrhandle_t *th_p, void *data)
struct bound_minimal_symbol lookup_minimal_symbol(const char *name, const char *sfile, struct objfile *objf)
observable< struct objfile * > new_objfile
observable< inferior * > inferior_created
const char * objfile_name(const struct objfile *objfile)
static process_stratum_target * as_process_stratum_target(target_ops *target)
struct program_space * current_program_space
bool libpthread_name_p(const char *name)
CORE_ADDR value_address() const
struct minimal_symbol * minsym
struct thread_db_info * info
struct thread_db_info * info
struct objfile * separate_debug_objfile_backlink
objfiles_range objfiles()
virtual ptid_t wait(ptid_t, struct target_waitstatus *, target_wait_flags options) TARGET_DEFAULT_FUNC(default_target_wait)
virtual std::string pid_to_str(ptid_t) TARGET_DEFAULT_FUNC(default_pid_to_str)
virtual void detach(inferior *, int) TARGET_DEFAULT_IGNORE()
target_ops * beneath() const
virtual void resume(ptid_t, int TARGET_DEBUG_PRINTER(target_debug_print_step), enum gdb_signal) TARGET_DEFAULT_NORETURN(noprocess())
virtual void update_thread_list() TARGET_DEFAULT_IGNORE()
virtual void mourn_inferior() TARGET_DEFAULT_FUNC(default_mourn_inferior)
virtual void follow_exec(inferior *, ptid_t, const char *) TARGET_DEFAULT_IGNORE()
virtual CORE_ADDR get_thread_local_address(ptid_t ptid, CORE_ADDR load_module_addr, CORE_ADDR offset) TARGET_DEFAULT_NORETURN(generic_tls_error())
target_waitkind kind() const
td_ta_delete_ftype * td_ta_delete_p
td_thr_get_info_ftype * td_thr_get_info_p
struct ps_prochandle proc_handle
td_init_ftype * td_init_p
td_thr_tlsbase_ftype * td_thr_tlsbase_p
td_ta_thr_iter_ftype * td_ta_thr_iter_p
process_stratum_target * process_target
td_thragent_t * thread_agent
int need_stale_parent_threads_check
struct thread_db_info * next
td_thr_tls_get_addr_ftype * td_thr_tls_get_addr_p
td_ta_map_lwp2thr_ftype * td_ta_map_lwp2thr_p
td_ta_new_ftype * td_ta_new_p
gdb::optional< gdb::byte_vector > thread_handle
int target_read_string(CORE_ADDR addr, int len, int width, unsigned int fetchlimit, gdb::unique_xmalloc_ptr< gdb_byte > *buffer, int *bytes_read)
bool target_has_execution(inferior *inf)
int target_has_registers()
static styled_string_s * styled_string(const ui_file_style &style, const char *str, styled_string_s &&tmp={})
void gdb_printf(struct ui_file *stream, const char *format,...)
const char * warning_pre_print
void gdb_puts(const char *linebuffer, struct ui_file *stream)
void value_print(struct value *val, struct ui_file *stream, const struct value_print_options *options)
void get_user_print_options(struct value_print_options *opts)
@ TARGET_WAITKIND_THREAD_EXITED
@ TARGET_WAITKIND_SIGNALLED