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;
320 return gdb::checked_static_cast<thread_db_thread_info *> (thread->
priv.get ());
331 return "generic 'call succeeded'";
333 return "generic error";
335 return "no thread to satisfy query";
337 return "no sync handle to satisfy query";
339 return "no LWP to satisfy query";
341 return "invalid process handle";
343 return "invalid thread handle";
345 return "invalid synchronization handle";
347 return "invalid thread agent";
349 return "invalid key";
351 return "no event message for getmsg";
353 return "FPU register set not available";
355 return "application not linked with libthread";
357 return "requested event is not supported";
359 return "capability not available";
361 return "debugger service failed";
363 return "operation not applicable to";
365 return "no thread-specific data for this thread";
367 return "malloc failed";
369 return "only part of register set was written/read";
371 return "X register set not available for this thread";
372#ifdef THREAD_DB_HAS_TD_NOTALLOC
374 return "thread has not yet allocated TLS for given module";
376#ifdef THREAD_DB_HAS_TD_VERSION
378 return "versions of libpthread and libthread_db do not match";
380#ifdef THREAD_DB_HAS_TD_NOTLS
382 return "there is no TLS segment in the given module";
385 snprintf (buf,
sizeof (buf),
"unknown thread_db error '%d'",
err);
407 gdb_assert (ptid.lwp () != 0);
412 info->proc_handle.thread = stopped;
413 err = info->td_ta_map_lwp2thr_p (info->thread_agent, ptid.lwp (),
416 error (_(
"Cannot find user-level thread for LWP %ld: %s"),
419 err = info->td_thr_get_info_p (&th, &ti);
421 error (_(
"thread_get_info_callback: cannot get thread info: %s"),
457 warning (_(
"Symbol \"%s\" not found in libthread_db: %s"),
470 CORE_ADDR version_addr;
474 if (version_msym.
minsym == NULL)
478 gdb::unique_xmalloc_ptr<char>
version
485 retval = (sscanf (
version.get (),
"%d.%d", &major, &minor) == 2
486 && (major < ver_major_min
487 || (major == ver_major_min && minor < ver_minor_min)));
508 catch (
const gdb_exception_error &except)
512 "Warning: thread_db_find_new_threads_silently: ");
533 _(
"Warning: couldn't activate thread debugging "
534 "using libthread_db: "));
551 if (dladdr (addr, &info) != 0)
552 return info.dli_fname;
586#define LOG(fmt, args...) \
589 if (tdb_testinfo->log_progress) \
591 debug_printf (fmt, ## args); \
592 gdb_flush (gdb_stdlog); \
597#define CHECK_1(expr, args...) \
602 LOG (" ... FAIL!\n"); \
609 CHECK_1 (expr, "(%s) == false", #expr)
611#define CALL_UNCHECKED(func, args...) \
614 tdb_testinfo->last_call = #func; \
615 tdb_testinfo->last_result \
616 = tdb_testinfo->info->func ## _p (args); \
620#define CHECK_CALL() \
621 CHECK_1 (tdb_testinfo->last_result == TD_OK, \
622 _("%s failed: %s"), \
623 tdb_testinfo->last_call, \
624 thread_db_err_str (tdb_testinfo->last_result)) \
626#define CALL(func, args...) \
629 CALL_UNCHECKED (func, args); \
641 LOG (
" %s", core_addr_to_string_nz ((CORE_ADDR) th->
th_unique));
660 LOG (_(
"; can't map_lwp2thr"));
666 LOG (
" => %s", core_addr_to_string_nz ((CORE_ADDR) th2.
th_unique));
729 bool test_passed =
true;
732 debug_printf (_(
"Running libthread_db integrity checks:\n"));
738 if (td_ta_thr_iter_p == NULL)
740 void *thr_iter =
verbose_dlsym (info->handle,
"td_ta_thr_iter");
741 if (thr_iter == NULL)
776 error (_(
"no threads seen"));
778 catch (
const gdb_exception_error &except)
784 _(
"libthread_db integrity checks failed: "));
790 debug_printf (_(
"libthread_db integrity checks passed.\n"));
814 obj).minsym != NULL);
831#define TDB_VERBOSE_DLSYM(info, func) \
832 info->func ## _p = (func ## _ftype *) verbose_dlsym (info->handle, #func)
834#define TDB_DLSYM(info, func) \
835 info->func ## _p = (func ## _ftype *) dlsym (info->handle, #func)
849 warning (_(
"Cannot initialize libthread_db: %s"),
870#ifdef THREAD_DB_HAS_TD_VERSION
907#undef TDB_VERBOSE_DLSYM
926 if (lp->ptid.pid () ==
pid)
939 gdb_printf (_(
"[Thread debugging using libthread_db enabled]\n"));
949 gdb_printf (_(
"Using host libthread_db library \"%ps\".\n"),
970 _(
"Trying host libthread_db library: %s.\n"),
973 if (check_auto_load_safe)
975 if (access (library, R_OK) != 0)
981 safe_strerror (errno));
986 (
"Loading libthread-db library \"%s\" from explicit directory.",
993 handle = dlopen (library, RTLD_NOW);
1010 if (libpath != NULL)
1019 if (strchr (library,
'/') != NULL)
1020 info->filename = gdb_realpath (library).release ();
1027 catch (
const gdb_exception_error &except)
1031 "Warning: While trying to load libthread_db: ");
1050 if (obj_name[0] !=
'/')
1052 warning (_(
"Expected absolute pathname for libpthread in the"
1053 " inferior, but got %ps."),
1058 std::string path = obj_name;
1059 size_t cp = path.rfind (
'/');
1061 gdb_assert (cp != std::string::npos);
1062 path.resize (cp + 1);
1064 path = path + subdir +
"/";
1090 if (obj->separate_debug_objfile_backlink != NULL)
1120 std::string path = std::string (dir, dir_len) +
"/" +
LIBTHREAD_DB_SO;
1134 std::vector<gdb::unique_xmalloc_ptr<char>> dir_vec
1137 for (
const gdb::unique_xmalloc_ptr<char> &this_dir_up : dir_vec)
1139 const char *this_dir = this_dir_up.get ();
1140 const int pdir_len =
sizeof (
"$pdir") - 1;
1141 size_t this_dir_len;
1143 this_dir_len = strlen (this_dir);
1145 if (strncmp (this_dir,
"$pdir", pdir_len) == 0
1146 && (this_dir[pdir_len] ==
'\0'
1147 || this_dir[pdir_len] ==
'/'))
1149 const char *subdir = NULL;
1151 std::string subdir_holder;
1152 if (this_dir[pdir_len] ==
'/')
1154 subdir_holder = std::string (this_dir + pdir_len + 1);
1155 subdir = subdir_holder.c_str ();
1161 else if (strcmp (this_dir,
"$sdir") == 0)
1181 _(
"thread_db_load_search returning %d\n"), rc);
1207 if (
inf->in_initial_library_scan)
1232 warning (_(
"Unable to find libthread_db matching inferior's thread"
1233 " 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."));
1371 tp->
priv.reset (priv);
1389 inf->unpush_target (
this);
1394 target_wait_flags options)
1403 switch (ourstatus->
kind ())
1441 const char *execd_pathname)
1467 err = info->td_thr_get_info_p (th_p, &ti);
1469 error (_(
"find_new_threads_callback: cannot get thread info: %s"),
1482 "thread_db: skipping exited and "
1483 "joined thread (0x%lx)\n",
1484 (
unsigned long) ti.
ti_tid);
1497 info->need_stale_parent_threads_check = 0;
1505 if (info->need_stale_parent_threads_check)
1509 if (tgid != -1 && tgid != info->pid)
1513 ptid_t ptid (info->pid, ti.
ti_lid);
1515 if (tp == NULL || tp->
priv == NULL)
1532 data.new_threads = 0;
1548 catch (
const gdb_exception_error &except)
1553 "Warning: find_new_threads_once: ");
1560 _(
"Found %d new threads in iteration %d.\n"),
1561 data.new_threads, iteration);
1567 return data.new_threads;
1582 stopped->
ptid.pid ());
1585 info->proc_handle.thread = stopped;
1593 for (i = 0, loop = 0; loop < 4 &&
err ==
TD_OK; ++i, ++loop)
1631 if (thread == NULL || thread->
executing ())
1664 return string_printf (
"Thread 0x%lx (LWP %ld)",
1665 (
unsigned long) priv->
tid, ptid.lwp ());
1677 if (
info->priv == NULL)
1705 if (handle_len == 4 &&
sizeof (handle_tid) == 8)
1706 handle_tid = (
thread_t) * (
const uint32_t *) thread_handle;
1707 else if (handle_len ==
sizeof (handle_tid))
1708 handle_tid = * (
const thread_t *) thread_handle;
1710 error (_(
"Thread handle size mismatch: %d vs %zu (from libthread_db)"),
1711 handle_len,
sizeof (handle_tid));
1717 if (priv != NULL && handle_tid == priv->
tid)
1732 return gdb::byte_vector ();
1734 int handle_size =
sizeof (priv->
tid);
1735 gdb::byte_vector rv (handle_size);
1737 memcpy (rv.data (), &priv->
tid, handle_size);
1771 if (!
info->td_thr_tls_get_addr_p)
1772 throw_error (TLS_NO_LIBRARY_SUPPORT_ERROR,
1773 _(
"No TLS library support"));
1778 err =
info->td_thr_tls_get_addr_p (&priv->
th,
1779 (psaddr_t)(uintptr_t) lm,
1786 if (!
info->td_thr_tlsbase_p)
1787 throw_error (TLS_LOAD_MODULE_NOT_FOUND_ERROR,
1788 _(
"TLS load module not found"));
1796 err =
info->td_thr_tlsbase_p (&priv->
th, 1, &address);
1797 address = (
char *) address + offset;
1800#ifdef THREAD_DB_HAS_TD_NOTALLOC
1806 throw_error (TLS_NOT_ALLOCATED_YET_ERROR,
1807 _(
"TLS not allocated yet"));
1812 throw_error (TLS_GENERIC_ERROR,
1819 ? (CORE_ADDR) (intptr_t) address
1820 : (CORE_ADDR) (uintptr_t) address);
1850 info->need_stale_parent_threads_check = 0;
1878 const char *cs = args ? args :
"";
1880 unsigned unique_filenames;
1881 size_t max_filename_len, pids_len;
1884 cs = skip_spaces (cs);
1886 error (_(
"'info auto-load libthread-db' does not accept any parameters"));
1888 std::vector<struct thread_db_info *> array;
1890 if (info->filename != NULL)
1891 array.push_back (info);
1894 std::sort (array.begin (), array.end (),
1900 unique_filenames = 0;
1901 max_filename_len = 0;
1903 for (i = 0; i < array.size (); i++)
1905 int pid = array[i]->pid;
1906 size_t this_pid_len;
1908 for (this_pid_len = 0;
pid != 0;
pid /= 10)
1914 max_filename_len = std::max (max_filename_len,
1918 pids_len -= strlen (
", ");
1921 pids_len += this_pid_len + strlen (
", ");
1924 pids_len -= strlen (
", ");
1933 "LinuxThreadDbTable");
1940 for (i = 0; i < array.size ();)
1949 while (i < array.size () && strcmp (info->filename,
1950 array[i]->filename) == 0)
1954 string_appendf (
pids,
"%u", array[i]->
pid);
1965 uiout->
message (_(
"No auto-loaded libthread-db.\n"));
1976 if (inferior_pid == 0)
1977 error (_(
"No inferior running"));
1982 error (_(
"No libthread_db loaded"));
2000Set search path for libthread_db."), _(
"\
2001Show the current search path or libthread_db."), _(
"\
2002This path is used to search for libthread_db to be loaded into \
2004Its value is a colon (':') separate list of directories to search.\n\
2005Setting the search path to an empty list resets it to its default value."),
2012Set libthread-db debugging."), _(
"\
2013Show libthread-db debugging."), _(
"\
2014When non-zero, libthread-db debugging is enabled."),
2021Enable or disable auto-loading of inferior specific libthread_db."), _(
"\
2022Show whether auto-loading inferior specific libthread_db is enabled."), _(
"\
2023If enabled, libthread_db will be searched in 'set libthread-db-search-path'\n\
2024locations to load libthread_db compatible with the inferior.\n\
2025Standard system libthread_db still gets loaded even with this option off.\n\
2026This option has security implications for untrusted inferiors."),
2032 _(
"Print the list of loaded inferior specific libthread_db.\n\
2033Usage: info auto-load libthread-db"),
2038Run integrity checks on the current inferior's libthread_db."),
2044Set whether to check libthread_db at load time."), _(
"\
2045Show whether to check libthread_db at load time."), _(
"\
2046If enabled GDB will run integrity checks on inferior specific libthread_db\n\
2047as 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
int unpush_target(struct target_ops *t)
void push_target(struct target_ops *t)
struct process_stratum_target * process_target()
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
gdb::byte_vector thread_info_to_thread_handle(struct thread_info *) 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
std::unique_ptr< private_thread_info > 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
struct value * evaluate_expression(struct expression *exp, struct type *expect_type)
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, bool void_context_p=false)
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_thr_tlsbase_ftype(const td_thrhandle_t *th, unsigned long int modid, psaddr_t *base)
td_err_e() td_thr_get_info_ftype(const td_thrhandle_t *th, td_thrinfo_t *infop)
#define LIBTHREAD_DB_SEARCH_PATH
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_init_ftype(void)
td_err_e() td_ta_map_lwp2thr_ftype(const td_thragent_t *ta, lwpid_t lwpid, td_thrhandle_t *th)
td_err_e() td_ta_new_ftype(struct ps_prochandle *ps, td_thragent_t **ta)
td_err_e() td_ta_delete_ftype(td_thragent_t *ta_p)
struct thread_info * any_live_thread_of_inferior(inferior *inf)
thread_info * find_thread_ptid(inferior *inf, ptid_t ptid)
struct thread_info * inferior_thread(void)
void switch_to_thread(struct thread_info *thr)
struct thread_info * add_thread_with_info(process_stratum_target *targ, ptid_t ptid, private_thread_info *)
#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
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