1 /* Multi-threaded debugging support for the thread_db interface,
2 used on operating systems such as Solaris and Linux.
3 Copyright 1999 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
22 /* This module implements a thread_stratum target that sits on top of
23 a normal process_stratum target (such as procfs or ptrace). The
24 process_stratum target must install this thread_stratum target when
25 it detects the presence of the thread_db shared library.
27 This module will then use the thread_db API to add thread-awareness
28 to the functionality provided by the process_stratum target (or in
29 some cases, to add user-level thread awareness on top of the
30 kernel-level thread awareness that is already provided by the
31 process_stratum target).
33 Solaris threads (for instance) are a multi-level thread implementation;
34 the kernel provides a Light Weight Process (LWP) which the procfs
35 process_stratum module is aware of. This module must then mediate
36 the relationship between kernel LWP threads and user (eg. posix)
39 Linux threads are likely to be different -- but the thread_db
40 library API should make the difference largely transparent to GDB.
44 /* The thread_db API provides a number of functions that give the caller
45 access to the inner workings of the child process's thread library.
46 We will be using the following (others may be added):
48 td_thr_validate Confirm valid "live" thread
49 td_thr_get_info Get info about a thread
50 td_thr_getgregs Get thread's general registers
51 td_thr_getfpregs Get thread's floating point registers
52 td_thr_setgregs Set thread's general registers
53 td_thr_setfpregs Set thread's floating point registers
54 td_ta_map_id2thr Get thread handle from thread id
55 td_ta_map_lwp2thr Get thread handle from LWP id
56 td_ta_thr_iter Iterate over all threads (with callback)
58 In return, the debugger has to provide certain services to the
59 thread_db library. Some of these aren't actually required to do
60 anything in practice. For instance, the thread_db expects to be
61 able to stop the child process and start it again: but in our
62 context, the child process will always be stopped already when we
63 invoke the thread_db library, so the functions that we provide for
64 the library to stop and start the child process are no-ops.
66 Here is the list of functions which we export to the thread_db
67 library, divided into no-op functions vs. functions that actually
72 ps_pstop Stop the child process
73 ps_pcontinue Continue the child process
74 ps_lstop Stop a specific LWP (kernel thread)
75 ps_lcontinue Continue an LWP
76 ps_lgetxregsize Get size of LWP's xregs (sparc)
77 ps_lgetxregs Get LWP's xregs (sparc)
78 ps_lsetxregs Set LWP's xregs (sparc)
80 Functions that have to do useful work:
82 ps_pglobal_lookup Get the address of a global symbol
83 ps_pdread Read memory, data segment
84 ps_ptread Read memory, text segment
85 ps_pdwrite Write memory, data segment
86 ps_ptwrite Write memory, text segment
87 ps_lgetregs Get LWP's general registers
88 ps_lgetfpregs Get LWP's floating point registers
89 ps_lsetregs Set LWP's general registers
90 ps_lsetfpregs Set LWP's floating point registers
91 ps_lgetLDT Get LWP's Local Descriptor Table (x86)
93 Thus, if we ask the thread_db library to give us the general registers
94 for user thread X, thread_db may figure out that user thread X is
95 actually mapped onto kernel thread Y. Thread_db does not know how
96 to obtain the registers for kernel thread Y, but GDB does, so thread_db
97 turns the request right back to us via the ps_lgetregs callback. */
100 #include "gdbthread.h"
102 #include "inferior.h"
105 #include "gdb_wait.h"
109 #if defined(USE_PROC_FS) || defined(HAVE_GREGSET_T)
110 #include <sys/procfs.h>
113 #if defined (HAVE_PROC_SERVICE_H)
114 #include <proc_service.h> /* defines incoming API (ps_* callbacks) */
116 #include "gdb_proc_service.h"
119 #if defined HAVE_STDINT_H /* Pre-5.2 systems don't have this header */
120 #if defined (HAVE_THREAD_DB_H)
121 #include <thread_db.h> /* defines outgoing API (td_thr_* calls) */
123 #include "gdb_thread_db.h"
126 #include <dlfcn.h> /* dynamic library interface */
128 /* Prototypes for supply_gregset etc. */
132 #define TIDGET(PID) (((PID) & 0x7fffffff) >> 16)
133 #define PIDGET(PID) (((PID) & 0xffff))
134 #define MERGEPID(PID, TID) (((PID) & 0xffff) | ((TID) << 16))
137 /* Macros for superimposing PID and TID into inferior_pid. */
138 #define THREAD_FLAG 0x80000000
139 #define is_thread(ARG) (((ARG) & THREAD_FLAG) != 0)
140 #define is_lwp(ARG) (((ARG) & THREAD_FLAG) == 0)
141 #define GET_LWP(PID) TIDGET (PID)
142 #define GET_THREAD(PID) TIDGET (PID)
143 #define BUILD_LWP(TID, PID) MERGEPID (PID, TID)
144 #define BUILD_THREAD(TID, PID) (MERGEPID (PID, TID) | THREAD_FLAG)
147 * target_beneath is a pointer to the target_ops underlying this one.
150 static struct target_ops
*target_beneath
;
154 * target vector defined in this module:
157 static struct target_ops thread_db_ops
;
160 * Typedefs required to resolve differences between the thread_db
161 * and proc_service API defined on different versions of Solaris:
164 #if defined(PROC_SERVICE_IS_OLD)
165 typedef const struct ps_prochandle
*gdb_ps_prochandle_t
;
166 typedef char *gdb_ps_read_buf_t
;
167 typedef char *gdb_ps_write_buf_t
;
168 typedef int gdb_ps_size_t
;
170 typedef struct ps_prochandle
*gdb_ps_prochandle_t
;
171 typedef void *gdb_ps_read_buf_t
;
172 typedef const void *gdb_ps_write_buf_t
;
173 typedef size_t gdb_ps_size_t
;
176 /* Unfortunately glibc 2.1.3 was released with a broken prfpregset_t
177 type. We let configure check for this lossage, and make
178 appropriate typedefs here. */
180 #ifdef PRFPREGSET_T_BROKEN
181 typedef elf_fpregset_t gdb_prfpregset_t
;
183 typedef prfpregset_t gdb_prfpregset_t
;
187 * proc_service callback functions, called by thread_db.
191 ps_pstop (gdb_ps_prochandle_t ph
) /* Process stop */
197 ps_pcontinue (gdb_ps_prochandle_t ph
) /* Process continue */
203 ps_lstop (gdb_ps_prochandle_t ph
, /* LWP stop */
210 ps_lcontinue (gdb_ps_prochandle_t ph
, /* LWP continue */
217 ps_lgetxregsize (gdb_ps_prochandle_t ph
, /* Get XREG size */
225 ps_lgetxregs (gdb_ps_prochandle_t ph
, /* Get XREGS */
233 ps_lsetxregs (gdb_ps_prochandle_t ph
, /* Set XREGS */
241 ps_plog (const char *fmt
, ...)
245 va_start (args
, fmt
);
246 vfprintf_filtered (gdb_stderr
, fmt
, args
);
249 /* Look up a symbol in GDB's global symbol table.
250 Return the symbol's address.
251 FIXME: it would be more correct to look up the symbol in the context
252 of the LD_OBJECT_NAME provided. However we're probably fairly safe
253 as long as there aren't name conflicts with other libraries. */
256 ps_pglobal_lookup (gdb_ps_prochandle_t ph
,
257 const char *ld_object_name
, /* the library name */
258 const char *ld_symbol_name
, /* the symbol name */
259 paddr_t
*ld_symbol_addr
) /* return the symbol addr */
261 struct minimal_symbol
*ms
;
263 ms
= lookup_minimal_symbol (ld_symbol_name
, NULL
, NULL
);
268 *ld_symbol_addr
= SYMBOL_VALUE_ADDRESS (ms
);
273 /* Worker function for all memory reads and writes: */
274 static ps_err_e
rw_common (const struct ps_prochandle
*ph
,
280 /* target_xfer_memory direction consts */
281 enum {PS_READ
= 0, PS_WRITE
= 1};
284 ps_pdread (gdb_ps_prochandle_t ph
, /* read from data segment */
286 gdb_ps_read_buf_t buf
,
289 return rw_common (ph
, addr
, buf
, size
, PS_READ
);
293 ps_pdwrite (gdb_ps_prochandle_t ph
, /* write to data segment */
295 gdb_ps_write_buf_t buf
,
298 return rw_common (ph
, addr
, (char *) buf
, size
, PS_WRITE
);
302 ps_ptread (gdb_ps_prochandle_t ph
, /* read from text segment */
304 gdb_ps_read_buf_t buf
,
307 return rw_common (ph
, addr
, buf
, size
, PS_READ
);
311 ps_ptwrite (gdb_ps_prochandle_t ph
, /* write to text segment */
313 gdb_ps_write_buf_t buf
,
316 return rw_common (ph
, addr
, (char *) buf
, size
, PS_WRITE
);
319 static struct cleanup
*save_inferior_pid (void);
320 static void restore_inferior_pid (void *saved_pid
);
321 static char *thr_err_string (td_err_e
);
322 static char *thr_state_string (td_thr_state_e
);
324 struct ps_prochandle
{
328 struct ps_prochandle main_prochandle
;
329 td_thragent_t
* main_threadagent
;
332 * Common proc_service routine for reading and writing memory.
335 /* FIXME: once we've munged the inferior_pid, why can't we
336 simply call target_read/write_memory and return? */
340 rw_common (const struct ps_prochandle
*ph
,
346 struct cleanup
*old_chain
= save_inferior_pid ();
350 inferior_pid
= main_prochandle
.pid
;
354 done
= current_target
.to_xfer_memory (addr
, buf
, size
, write_p
,
358 if (write_p
== PS_READ
)
359 print_sys_errmsg ("rw_common (): read", errno
);
361 print_sys_errmsg ("rw_common (): write", errno
);
368 do_cleanups (old_chain
);
372 /* Cleanup functions used by the register callbacks
373 (which have to manipulate the global inferior_pid). */
376 ps_lgetregs (gdb_ps_prochandle_t ph
, /* Get LWP general regs */
380 struct cleanup
*old_chain
= save_inferior_pid ();
382 inferior_pid
= BUILD_LWP (lwpid
, main_prochandle
.pid
);
383 current_target
.to_fetch_registers (-1);
385 fill_gregset (gregset
, -1);
386 do_cleanups (old_chain
);
392 ps_lsetregs (gdb_ps_prochandle_t ph
, /* Set LWP general regs */
394 const prgregset_t gregset
)
396 struct cleanup
*old_chain
= save_inferior_pid ();
398 inferior_pid
= BUILD_LWP (lwpid
, main_prochandle
.pid
);
399 supply_gregset (gregset
);
400 current_target
.to_store_registers (-1);
401 do_cleanups (old_chain
);
406 ps_lgetfpregs (gdb_ps_prochandle_t ph
, /* Get LWP float regs */
408 gdb_prfpregset_t
*fpregset
)
410 struct cleanup
*old_chain
= save_inferior_pid ();
412 inferior_pid
= BUILD_LWP (lwpid
, main_prochandle
.pid
);
413 current_target
.to_fetch_registers (-1);
414 fill_fpregset (fpregset
, -1);
415 do_cleanups (old_chain
);
420 ps_lsetfpregs (gdb_ps_prochandle_t ph
, /* Set LWP float regs */
422 const gdb_prfpregset_t
*fpregset
)
424 struct cleanup
*old_chain
= save_inferior_pid ();
426 inferior_pid
= BUILD_LWP (lwpid
, main_prochandle
.pid
);
427 supply_fpregset (fpregset
);
428 current_target
.to_store_registers (-1);
429 do_cleanups (old_chain
);
436 * return the main pid for the child process
437 * (special for Linux -- not used on Solaris)
441 ps_getpid (gdb_ps_prochandle_t ph
)
448 /* Reads the local descriptor table of a LWP. */
451 ps_lgetLDT (gdb_ps_prochandle_t ph
, lwpid_t lwpid
,
454 /* NOTE: only used on Solaris, therefore OK to refer to procfs.c */
455 extern struct ssd
*procfs_find_LDT_entry (int);
458 ret
= procfs_find_LDT_entry (BUILD_LWP (lwpid
,
459 PIDGET (main_prochandle
.pid
)));
462 memcpy (pldt
, ret
, sizeof (struct ssd
));
465 else /* LDT not found. */
468 #endif /* TM_I386SOL2_H */
471 * Pointers to thread_db functions:
473 * These are a dynamic library mechanism.
474 * The dlfcn.h interface will be used to initialize these
475 * so that they point to the appropriate functions in the
476 * thread_db dynamic library. This is done dynamically
477 * so that GDB can still run on systems that lack thread_db.
480 static td_err_e (*p_td_init
) (void);
482 static td_err_e (*p_td_ta_new
) (const struct ps_prochandle
*ph_p
,
483 td_thragent_t
**ta_pp
);
485 static td_err_e (*p_td_ta_delete
) (td_thragent_t
*ta_p
);
487 static td_err_e (*p_td_ta_get_nthreads
) (const td_thragent_t
*ta_p
,
491 static td_err_e (*p_td_ta_thr_iter
) (const td_thragent_t
*ta_p
,
494 td_thr_state_e state
,
496 sigset_t
*ti_sigmask_p
,
497 unsigned ti_user_flags
);
499 static td_err_e (*p_td_ta_event_addr
) (const td_thragent_t
*ta_p
,
501 td_notify_t
*notify_p
);
503 static td_err_e (*p_td_ta_event_getmsg
) (const td_thragent_t
*ta_p
,
504 td_event_msg_t
*msg
);
506 static td_err_e (*p_td_ta_set_event
) (const td_thragent_t
*ta_p
,
507 td_thr_events_t
*events
);
509 static td_err_e (*p_td_thr_validate
) (const td_thrhandle_t
*th_p
);
511 static td_err_e (*p_td_thr_event_enable
) (const td_thrhandle_t
*th_p
,
514 static td_err_e (*p_td_thr_get_info
) (const td_thrhandle_t
*th_p
,
517 static td_err_e (*p_td_thr_getgregs
) (const td_thrhandle_t
*th_p
,
520 static td_err_e (*p_td_thr_setgregs
) (const td_thrhandle_t
*th_p
,
521 const prgregset_t regset
);
523 static td_err_e (*p_td_thr_getfpregs
) (const td_thrhandle_t
*th_p
,
524 gdb_prfpregset_t
*fpregset
);
526 static td_err_e (*p_td_thr_setfpregs
) (const td_thrhandle_t
*th_p
,
527 const gdb_prfpregset_t
*fpregset
);
529 static td_err_e (*p_td_ta_map_id2thr
) (const td_thragent_t
*ta_p
,
531 td_thrhandle_t
*th_p
);
533 static td_err_e (*p_td_ta_map_lwp2thr
) (const td_thragent_t
*ta_p
,
535 td_thrhandle_t
*th_p
);
538 * API and target vector initialization function: thread_db_initialize.
540 * NOTE: this function is deliberately NOT named with the GDB convention
541 * of module initializer function names that begin with "_initialize".
542 * This module is NOT intended to be auto-initialized at GDB startup.
543 * Rather, it will only be initialized when a multi-threaded child
544 * process is detected.
549 * Initializer for thread_db library interface.
550 * This function does the dynamic library stuff (dlopen, dlsym),
551 * and then calls the thread_db library's one-time initializer
552 * function (td_init). If everything succeeds, this function
553 * returns true; otherwise it returns false, and this module
558 init_thread_db_library (void)
563 /* Open a handle to the "thread_db" dynamic library. */
564 if ((dlhandle
= dlopen ("libthread_db.so.1", RTLD_NOW
)) == NULL
)
567 /* Initialize pointers to the dynamic library functions we will use.
568 * Note that we are not calling the functions here -- we are only
569 * establishing pointers to them.
572 /* td_init: initialize thread_db library. */
573 if ((p_td_init
= dlsym (dlhandle
, "td_init")) == NULL
)
575 /* td_ta_new: register a target process with thread_db. */
576 if ((p_td_ta_new
= dlsym (dlhandle
, "td_ta_new")) == NULL
)
578 /* td_ta_delete: un-register a target process with thread_db. */
579 if ((p_td_ta_delete
= dlsym (dlhandle
, "td_ta_delete")) == NULL
)
582 /* td_ta_map_id2thr: get thread handle from thread id. */
583 if ((p_td_ta_map_id2thr
= dlsym (dlhandle
, "td_ta_map_id2thr")) == NULL
)
585 /* td_ta_map_lwp2thr: get thread handle from lwp id. */
586 if ((p_td_ta_map_lwp2thr
= dlsym (dlhandle
, "td_ta_map_lwp2thr")) == NULL
)
588 /* td_ta_get_nthreads: get number of threads in target process. */
589 if ((p_td_ta_get_nthreads
= dlsym (dlhandle
, "td_ta_get_nthreads")) == NULL
)
591 /* td_ta_thr_iter: iterate over all thread handles. */
592 if ((p_td_ta_thr_iter
= dlsym (dlhandle
, "td_ta_thr_iter")) == NULL
)
595 /* td_thr_validate: make sure a thread handle is real and alive. */
596 if ((p_td_thr_validate
= dlsym (dlhandle
, "td_thr_validate")) == NULL
)
598 /* td_thr_get_info: get a bunch of info about a thread. */
599 if ((p_td_thr_get_info
= dlsym (dlhandle
, "td_thr_get_info")) == NULL
)
601 /* td_thr_getgregs: get general registers for thread. */
602 if ((p_td_thr_getgregs
= dlsym (dlhandle
, "td_thr_getgregs")) == NULL
)
604 /* td_thr_setgregs: set general registers for thread. */
605 if ((p_td_thr_setgregs
= dlsym (dlhandle
, "td_thr_setgregs")) == NULL
)
607 /* td_thr_getfpregs: get floating point registers for thread. */
608 if ((p_td_thr_getfpregs
= dlsym (dlhandle
, "td_thr_getfpregs")) == NULL
)
610 /* td_thr_setfpregs: set floating point registers for thread. */
611 if ((p_td_thr_setfpregs
= dlsym (dlhandle
, "td_thr_setfpregs")) == NULL
)
617 warning ("init_thread_db: td_init: %s", thr_err_string (ret
));
621 /* Optional functions:
622 We can still debug even if the following functions are not found. */
624 /* td_ta_event_addr: get the breakpoint address for specified event. */
625 p_td_ta_event_addr
= dlsym (dlhandle
, "td_ta_event_addr");
627 /* td_ta_event_getmsg: get the next event message for the process. */
628 p_td_ta_event_getmsg
= dlsym (dlhandle
, "td_ta_event_getmsg");
630 /* td_ta_set_event: request notification of an event. */
631 p_td_ta_set_event
= dlsym (dlhandle
, "td_ta_set_event");
633 /* td_thr_event_enable: enable event reporting in a thread. */
634 p_td_thr_event_enable
= dlsym (dlhandle
, "td_thr_event_enable");
636 return 1; /* success */
640 * Local utility functions:
648 save_inferior_pid - Save inferior_pid on the cleanup list
649 restore_inferior_pid - Restore inferior_pid from the cleanup list
653 struct cleanup *save_inferior_pid (void);
654 void restore_inferior_pid (void *saved_pid);
658 These two functions act in unison to restore inferior_pid in
663 inferior_pid is a global variable that needs to be changed by many
664 of these routines before calling functions in procfs.c. In order
665 to guarantee that inferior_pid gets restored (in case of errors),
666 you need to call save_inferior_pid before changing it. At the end
667 of the function, you should invoke do_cleanups to restore it.
671 static struct cleanup
*
672 save_inferior_pid (void)
676 saved_pid_ptr
= xmalloc (sizeof (int));
677 *saved_pid_ptr
= inferior_pid
;
678 return make_cleanup (restore_inferior_pid
, saved_pid_ptr
);
682 restore_inferior_pid (void *arg
)
684 int *saved_pid_ptr
= arg
;
685 inferior_pid
= *saved_pid_ptr
;
693 thr_err_string - Convert a thread_db error code to a string
697 char * thr_err_string (errcode)
701 Return a string description of the thread_db errcode. If errcode
702 is unknown, then return an <unknown> message.
707 thr_err_string (td_err_e errcode
)
712 case TD_OK
: return "generic 'call succeeded'";
713 case TD_ERR
: return "generic error";
714 case TD_NOTHR
: return "no thread to satisfy query";
715 case TD_NOSV
: return "no sync handle to satisfy query";
716 case TD_NOLWP
: return "no lwp to satisfy query";
717 case TD_BADPH
: return "invalid process handle";
718 case TD_BADTH
: return "invalid thread handle";
719 case TD_BADSH
: return "invalid synchronization handle";
720 case TD_BADTA
: return "invalid thread agent";
721 case TD_BADKEY
: return "invalid key";
722 case TD_NOMSG
: return "no event message for getmsg";
723 case TD_NOFPREGS
: return "FPU register set not available";
724 case TD_NOLIBTHREAD
: return "application not linked with libthread";
725 case TD_NOEVENT
: return "requested event is not supported";
726 case TD_NOCAPAB
: return "capability not available";
727 case TD_DBERR
: return "debugger service failed";
728 case TD_NOAPLIC
: return "operation not applicable to";
729 case TD_NOTSD
: return "no thread-specific data for this thread";
730 case TD_MALLOC
: return "malloc failed";
731 case TD_PARTIALREG
: return "only part of register set was written/read";
732 case TD_NOXREGS
: return "X register set not available for this thread";
734 sprintf (buf
, "unknown thread_db error '%d'", errcode
);
743 thr_state_string - Convert a thread_db state code to a string
747 char *thr_state_string (statecode)
751 Return the thread_db state string associated with statecode.
752 If statecode is unknown, then return an <unknown> message.
757 thr_state_string (td_thr_state_e statecode
)
762 case TD_THR_STOPPED
: return "stopped by debugger";
763 case TD_THR_RUN
: return "runnable";
764 case TD_THR_ACTIVE
: return "active";
765 case TD_THR_ZOMBIE
: return "zombie";
766 case TD_THR_SLEEP
: return "sleeping";
767 case TD_THR_STOPPED_ASLEEP
: return "stopped by debugger AND blocked";
769 sprintf (buf
, "unknown thread_db state %d", statecode
);
775 * Local thread/event list.
776 * This data structure will be used to hold a list of threads and
777 * pending/deliverable events.
780 typedef struct THREADINFO
{
781 thread_t tid
; /* thread ID */
782 pid_t lid
; /* process/lwp ID */
783 td_thr_state_e state
; /* thread state (a la thread_db) */
784 td_thr_type_e type
; /* thread type (a la thread_db) */
785 int pending
; /* true if holding a pending event */
786 int status
; /* wait status of any interesting event */
789 threadinfo
* threadlist
;
790 int threadlist_max
= 0; /* current size of table */
791 int threadlist_top
= 0; /* number of threads now in table */
792 #define THREADLIST_ALLOC 100 /* chunk size by which to expand table */
795 insert_thread (int tid
, int lid
, td_thr_state_e state
, td_thr_type_e type
)
797 if (threadlist_top
>= threadlist_max
)
799 threadlist_max
+= THREADLIST_ALLOC
;
800 threadlist
= realloc (threadlist
,
801 threadlist_max
* sizeof (threadinfo
));
802 if (threadlist
== NULL
)
805 threadlist
[threadlist_top
].tid
= tid
;
806 threadlist
[threadlist_top
].lid
= lid
;
807 threadlist
[threadlist_top
].state
= state
;
808 threadlist
[threadlist_top
].type
= type
;
809 threadlist
[threadlist_top
].pending
= 0;
810 threadlist
[threadlist_top
].status
= 0;
812 return &threadlist
[threadlist_top
++];
816 empty_threadlist (void)
822 next_pending_event (void)
826 for (i
= 0; i
< threadlist_top
; i
++)
827 if (threadlist
[i
].pending
)
828 return &threadlist
[i
];
834 threadlist_iter (func
, data
, state
, type
)
837 td_thr_state_e state
;
842 for (i
= 0; i
< threadlist_top
; i
++)
843 if ((state
== TD_THR_ANY_STATE
|| state
== threadlist
[i
].state
) &&
844 (type
== TD_THR_ANY_TYPE
|| type
== threadlist
[i
].type
))
845 if ((*func
) (&threadlist
[i
], data
) != 0)
854 * Here we keep state information all collected in one place.
857 /* This flag is set when we activate, so that we don't do it twice.
858 Defined in linux-thread.c and used for inter-target syncronization. */
859 extern int using_thread_db
;
861 /* The process id for which we've stopped.
862 * This is only set when we actually stop all threads.
863 * Otherwise it's zero.
865 static int event_pid
;
868 * The process id for a new thread to which we've just attached.
869 * This process needs special handling at resume time.
871 static int attach_pid
;
875 * thread_db event handling:
877 * The mechanism for event notification via the thread_db API.
878 * These events are implemented as breakpoints. The thread_db
879 * library gives us an address where we can set a breakpoint.
880 * When the breakpoint is hit, it represents an event of interest
887 /* Location of the thread creation event breakpoint. The code at this
888 location in the child process will be called by the pthread library
889 whenever a new thread is created. By setting a special breakpoint
890 at this location, GDB can detect when a new thread is created. We
891 obtain this location via the td_ta_event_addr call. */
893 static CORE_ADDR thread_creation_bkpt_address
;
895 /* Location of the thread death event breakpoint. The code at this
896 location in the child process will be called by the pthread library
897 whenever a thread is destroyed. By setting a special breakpoint at
898 this location, GDB can detect when a new thread is created. We
899 obtain this location via the td_ta_event_addr call. */
901 static CORE_ADDR thread_death_bkpt_address
;
903 /* This function handles the global parts of enabling thread events.
904 The thread-specific enabling is handled per-thread elsewhere. */
907 enable_thread_event_reporting (td_thragent_t
*ta
)
909 td_thr_events_t events
;
913 if (p_td_ta_set_event
== NULL
||
914 p_td_ta_event_addr
== NULL
||
915 p_td_ta_event_getmsg
== NULL
||
916 p_td_thr_event_enable
== NULL
)
917 return; /* can't do thread event reporting without these funcs */
919 /* set process wide mask saying which events we are interested in */
920 td_event_emptyset (&events
);
921 td_event_addset (&events
, TD_CREATE
);
922 td_event_addset (&events
, TD_DEATH
);
924 if (p_td_ta_set_event (ta
, &events
) != TD_OK
)
926 warning ("unable to set global thread event mask");
930 /* Delete previous thread event breakpoints, if any. */
931 remove_thread_event_breakpoints ();
933 /* create breakpoints -- thread creation and death */
934 /* thread creation */
935 /* get breakpoint location */
936 if (p_td_ta_event_addr (ta
, TD_CREATE
, ¬ify
) != TD_OK
)
938 warning ("unable to get location for thread creation breakpoint");
942 /* Set up the breakpoint. */
943 create_thread_event_breakpoint (notify
.u
.bptaddr
);
945 /* Save it's location. */
946 thread_creation_bkpt_address
= notify
.u
.bptaddr
;
949 /* get breakpoint location */
950 if (p_td_ta_event_addr (ta
, TD_DEATH
, ¬ify
) != TD_OK
)
952 warning ("unable to get location for thread death breakpoint");
955 /* Set up the breakpoint. */
956 create_thread_event_breakpoint (notify
.u
.bptaddr
);
958 /* Save it's location. */
959 thread_death_bkpt_address
= notify
.u
.bptaddr
;
962 /* This function handles the global parts of disabling thread events.
963 The thread-specific enabling is handled per-thread elsewhere. */
966 disable_thread_event_reporting (td_thragent_t
*ta
)
968 td_thr_events_t events
;
970 /* set process wide mask saying we aren't interested in any events */
971 td_event_emptyset (&events
);
972 p_td_ta_set_event (main_threadagent
, &events
);
974 /* Delete thread event breakpoints, if any. */
975 remove_thread_event_breakpoints ();
976 thread_creation_bkpt_address
= 0;
977 thread_death_bkpt_address
= 0;
980 /* check_for_thread_event
982 if it's a thread event we recognize (currently
983 we only recognize creation and destruction
984 events), return 1; else return 0. */
988 check_for_thread_event (struct target_waitstatus
*tws
, int event_pid
)
990 /* FIXME: to be more efficient, we should keep a static
991 list of threads, and update it only here (with td_ta_thr_iter). */
995 thread_db_push_target (void)
997 /* Called ONLY from thread_db_new_objfile after td_ta_new call succeeds. */
999 /* Push this target vector */
1000 push_target (&thread_db_ops
);
1001 /* Find the underlying process-layer target for calling later. */
1002 target_beneath
= find_target_beneath (&thread_db_ops
);
1003 using_thread_db
= 1;
1004 /* Turn on thread_db event-reporting API. */
1005 enable_thread_event_reporting (main_threadagent
);
1009 thread_db_unpush_target (void)
1011 /* Must be called whenever we remove ourself from the target stack! */
1013 using_thread_db
= 0;
1014 target_beneath
= NULL
;
1016 /* delete local list of threads */
1017 empty_threadlist ();
1018 /* Turn off the thread_db API. */
1019 p_td_ta_delete (main_threadagent
);
1020 /* Unpush this target vector */
1021 unpush_target (&thread_db_ops
);
1022 /* Reset linuxthreads module. */
1023 linuxthreads_discard_global_state ();
1027 * New objfile hook function:
1028 * Called for each new objfile (image, shared lib) in the target process.
1030 * The purpose of this function is to detect that the target process
1031 * is linked with the (appropriate) thread library. So every time a
1032 * new target shared library is detected, we will call td_ta_new.
1033 * If it succeeds, we know we have a multi-threaded target process
1034 * that we can debug using the thread_db API.
1038 * new_objfile function:
1040 * connected to target_new_objfile_hook, this function gets called
1041 * every time a new binary image is loaded.
1043 * At each call, we attempt to open the thread_db connection to the
1044 * child process. If it succeeds, we know we have a libthread process
1045 * and we can debug it with this target vector. Therefore we push
1046 * ourself onto the target stack.
1049 static void (*target_new_objfile_chain
) (struct objfile
*objfile
);
1050 static int stop_or_attach_thread_callback (const td_thrhandle_t
*th
,
1052 static int wait_thread_callback (const td_thrhandle_t
*th
,
1056 thread_db_new_objfile (struct objfile
*objfile
)
1060 if (using_thread_db
) /* libthread already detected, and */
1061 goto quit
; /* thread target vector activated. */
1063 if (objfile
== NULL
)
1064 goto quit
; /* un-interesting object file */
1066 /* Initialize our "main prochandle" with the main inferior pid. */
1067 main_prochandle
.pid
= PIDGET (inferior_pid
);
1069 /* Now attempt to open a thread_db connection to the
1070 thread library running in the child process. */
1071 ret
= p_td_ta_new (&main_prochandle
, &main_threadagent
);
1074 warning ("Unexpected error initializing thread_db: %s",
1075 thr_err_string (ret
));
1077 case TD_NOLIBTHREAD
: /* expected: no libthread in child process (yet) */
1079 case TD_OK
: /* libthread detected in child: we go live now! */
1080 thread_db_push_target ();
1081 event_pid
= inferior_pid
; /* for resume */
1083 /* Now stop everyone else, and attach any new threads you find. */
1084 p_td_ta_thr_iter (main_threadagent
,
1085 stop_or_attach_thread_callback
,
1088 TD_THR_LOWEST_PRIORITY
,
1090 TD_THR_ANY_USER_FLAGS
);
1092 /* Now go call wait on all the threads you've stopped:
1093 This allows us to absorb the SIGKILL event, and to make sure
1094 that the thread knows that it is stopped (Linux peculiarity). */
1095 p_td_ta_thr_iter (main_threadagent
,
1096 wait_thread_callback
,
1099 TD_THR_LOWEST_PRIORITY
,
1101 TD_THR_ANY_USER_FLAGS
);
1106 if (target_new_objfile_chain
)
1107 target_new_objfile_chain (objfile
);
1115 thread_db_alive - test thread for "aliveness"
1119 static bool thread_db_alive (int pid);
1123 returns true if thread still active in inferior.
1128 thread_db_alive (int pid
)
1130 if (is_thread (pid
)) /* user-space (non-kernel) thread */
1135 pid
= GET_THREAD (pid
);
1136 if ((ret
= p_td_ta_map_id2thr (main_threadagent
, pid
, &th
)) != TD_OK
)
1137 return 0; /* thread not found */
1138 if ((ret
= p_td_thr_validate (&th
)) != TD_OK
)
1139 return 0; /* thread not valid */
1140 return 1; /* known thread: return true */
1142 else if (target_beneath
->to_thread_alive
)
1143 return target_beneath
->to_thread_alive (pid
);
1145 return 0; /* default to "not alive" (shouldn't happen anyway) */
1149 * get_lwp_from_thread_handle
1152 static int /* lwpid_t or pid_t */
1153 get_lwp_from_thread_handle (td_thrhandle_t
*th
)
1158 if ((ret
= p_td_thr_get_info (th
, &ti
)) != TD_OK
)
1159 error ("get_lwp_from_thread_handle: thr_get_info failed: %s",
1160 thr_err_string (ret
));
1166 * get_lwp_from_thread_id
1169 static int /* lwpid_t or pid_t */
1170 get_lwp_from_thread_id (tid
)
1171 int tid
; /* thread_t? */
1176 if ((ret
= p_td_ta_map_id2thr (main_threadagent
, tid
, &th
)) != TD_OK
)
1177 error ("get_lwp_from_thread_id: map_id2thr failed: %s",
1178 thr_err_string (ret
));
1180 return get_lwp_from_thread_handle (&th
);
1184 * pid_to_str has to handle user-space threads.
1185 * If not a user-space thread, then pass the request on to the
1186 * underlying stratum if it can handle it: else call normal_pid_to_str.
1190 thread_db_pid_to_str (int pid
)
1192 static char buf
[100];
1197 if (is_thread (pid
))
1199 if ((ret
= p_td_ta_map_id2thr (main_threadagent
,
1202 error ("thread_db: map_id2thr failed: %s", thr_err_string (ret
));
1204 if ((ret
= p_td_thr_get_info (&th
, &ti
)) != TD_OK
)
1205 error ("thread_db: thr_get_info failed: %s", thr_err_string (ret
));
1207 if (ti
.ti_state
== TD_THR_ACTIVE
&&
1209 sprintf (buf
, "Thread %d (LWP %d)", ti
.ti_tid
, ti
.ti_lid
);
1211 sprintf (buf
, "Thread %d (%s)", ti
.ti_tid
,
1212 thr_state_string (ti
.ti_state
));
1214 else if (GET_LWP (pid
))
1215 sprintf (buf
, "LWP %d", GET_LWP (pid
));
1216 else return normal_pid_to_str (pid
);
1222 * thread_db target vector functions:
1226 thread_db_files_info (struct target_ops
*tgt_vector
)
1228 /* This function will be unnecessary in real life. */
1229 printf_filtered ("thread_db stratum:\n");
1230 target_beneath
->to_files_info (tgt_vector
);
1234 * xfer_memory has to munge the inferior_pid before passing the call
1235 * down to the target layer.
1239 thread_db_xfer_memory (memaddr
, myaddr
, len
, dowrite
, target
)
1244 struct target_ops
*target
; /* ignored */
1246 struct cleanup
*old_chain
;
1249 old_chain
= save_inferior_pid ();
1251 if (is_thread (inferior_pid
) ||
1252 !target_thread_alive (inferior_pid
))
1254 /* FIXME: use the LID/LWP, so that underlying process layer
1255 can read memory from specific threads? */
1256 inferior_pid
= main_prochandle
.pid
;
1259 ret
= target_beneath
->to_xfer_memory (memaddr
, myaddr
, len
,
1261 do_cleanups (old_chain
);
1266 * fetch_registers has to determine if inferior_pid is a user-space thread.
1267 * If so, we use the thread_db API to get the registers.
1268 * And if not, we call the underlying process stratum.
1272 thread_db_fetch_registers (int regno
)
1274 td_thrhandle_t thandle
;
1275 gdb_prfpregset_t fpregset
;
1276 prgregset_t gregset
;
1280 if (!is_thread (inferior_pid
)) /* kernel thread */
1281 { /* pass the request on to the target underneath. */
1282 target_beneath
->to_fetch_registers (regno
);
1286 /* convert inferior_pid into a td_thrhandle_t */
1288 if ((thread
= GET_THREAD (inferior_pid
)) == 0)
1289 error ("fetch_registers: thread == 0");
1291 if ((ret
= p_td_ta_map_id2thr (main_threadagent
, thread
, &thandle
)) != TD_OK
)
1292 error ("fetch_registers: td_ta_map_id2thr: %s", thr_err_string (ret
));
1294 /* Get the integer regs:
1295 For the sparc, TD_PARTIALREG means that only i0->i7, l0->l7,
1296 pc and sp are saved (by a thread context switch). */
1297 if ((ret
= p_td_thr_getgregs (&thandle
, gregset
)) != TD_OK
&&
1298 ret
!= TD_PARTIALREG
)
1299 error ("fetch_registers: td_thr_getgregs %s", thr_err_string (ret
));
1301 /* And, now the fp regs */
1302 if ((ret
= p_td_thr_getfpregs (&thandle
, &fpregset
)) != TD_OK
&&
1304 error ("fetch_registers: td_thr_getfpregs %s", thr_err_string (ret
));
1306 /* Note that we must call supply_{g fp}regset *after* calling the td routines
1307 because the td routines call ps_lget* which affect the values stored in the
1310 supply_gregset (gregset
);
1311 supply_fpregset (&fpregset
);
1316 * store_registers has to determine if inferior_pid is a user-space thread.
1317 * If so, we use the thread_db API to get the registers.
1318 * And if not, we call the underlying process stratum.
1322 thread_db_store_registers (int regno
)
1324 td_thrhandle_t thandle
;
1325 gdb_prfpregset_t fpregset
;
1326 prgregset_t gregset
;
1330 if (!is_thread (inferior_pid
)) /* Kernel thread: */
1331 { /* pass the request on to the underlying target vector. */
1332 target_beneath
->to_store_registers (regno
);
1336 /* convert inferior_pid into a td_thrhandle_t */
1338 if ((thread
= GET_THREAD (inferior_pid
)) == 0)
1339 error ("store_registers: thread == 0");
1341 if ((ret
= p_td_ta_map_id2thr (main_threadagent
, thread
, &thandle
)) != TD_OK
)
1342 error ("store_registers: td_ta_map_id2thr %s", thr_err_string (ret
));
1345 { /* Not writing all the regs */
1346 /* save new register value */
1347 /* MVS: I don't understand this... */
1348 char old_value
[REGISTER_SIZE
];
1350 memcpy (old_value
, ®isters
[REGISTER_BYTE (regno
)], REGISTER_SIZE
);
1352 if ((ret
= p_td_thr_getgregs (&thandle
, gregset
)) != TD_OK
)
1353 error ("store_registers: td_thr_getgregs %s", thr_err_string (ret
));
1354 if ((ret
= p_td_thr_getfpregs (&thandle
, &fpregset
)) != TD_OK
)
1355 error ("store_registers: td_thr_getfpregs %s", thr_err_string (ret
));
1357 /* restore new register value */
1358 memcpy (®isters
[REGISTER_BYTE (regno
)], old_value
, REGISTER_SIZE
);
1362 fill_gregset (gregset
, regno
);
1363 fill_fpregset (&fpregset
, regno
);
1365 if ((ret
= p_td_thr_setgregs (&thandle
, gregset
)) != TD_OK
)
1366 error ("store_registers: td_thr_setgregs %s", thr_err_string (ret
));
1367 if ((ret
= p_td_thr_setfpregs (&thandle
, &fpregset
)) != TD_OK
&&
1369 error ("store_registers: td_thr_setfpregs %s", thr_err_string (ret
));
1373 handle_new_thread (int tid
, /* user thread id */
1374 int lid
, /* kernel thread id */
1377 int gdb_pid
= BUILD_THREAD (tid
, main_prochandle
.pid
);
1378 int wait_pid
, wait_status
;
1381 printf_filtered ("[New %s]\n", target_pid_to_str (gdb_pid
));
1382 add_thread (gdb_pid
);
1384 if (lid
!= main_prochandle
.pid
)
1386 attach_thread (lid
);
1387 /* According to the Eric Paire model, we now have to send
1388 the restart signal to the new thread -- however, empirically,
1389 I do not find that to be necessary. */
1395 test_for_new_thread (int tid
, int lid
, int verbose
)
1397 if (!in_thread_list (BUILD_THREAD (tid
, main_prochandle
.pid
)))
1398 handle_new_thread (tid
, lid
, verbose
);
1402 * Callback function that gets called once per USER thread
1403 * (i.e., not kernel) thread by td_ta_thr_iter.
1407 find_new_threads_callback (const td_thrhandle_t
*th
, void *ignored
)
1412 if ((ret
= p_td_thr_get_info (th
, &ti
)) != TD_OK
)
1414 warning ("find_new_threads_callback: %s", thr_err_string (ret
));
1415 return -1; /* bail out, get_info failed. */
1419 As things now stand, this should never detect a new thread.
1420 But if it does, we could be in trouble because we aren't calling
1421 wait_thread_callback for it. */
1422 test_for_new_thread (ti
.ti_tid
, ti
.ti_lid
, 0);
1427 * find_new_threads uses the thread_db iterator function to discover
1428 * user-space threads. Then if the underlying process stratum has a
1429 * find_new_threads method, we call that too.
1433 thread_db_find_new_threads (void)
1435 if (inferior_pid
== -1) /* FIXME: still necessary? */
1437 printf_filtered ("No process.\n");
1440 p_td_ta_thr_iter (main_threadagent
,
1441 find_new_threads_callback
,
1444 TD_THR_LOWEST_PRIORITY
,
1446 TD_THR_ANY_USER_FLAGS
);
1447 if (target_beneath
->to_find_new_threads
)
1448 target_beneath
->to_find_new_threads ();
1452 * Resume all threads, or resume a single thread.
1453 * If step is true, then single-step the appropriate thread
1454 * (or single-step inferior_pid, but continue everyone else).
1455 * If signo is true, then send that signal to at least one thread.
1459 * This function is called once for each thread before resuming.
1460 * It sends continue (no step, and no signal) to each thread except
1461 * the main thread, and
1462 * the event thread (the one that stopped at a breakpoint etc.)
1464 * The event thread is handled separately so that it can be sent
1465 * the stepping and signal args with which target_resume was called.
1467 * The main thread is resumed last, so that the thread_db proc_service
1468 * callbacks will still work during the iterator function.
1472 resume_thread_callback (const td_thrhandle_t
*th
, void *data
)
1477 if ((ret
= p_td_thr_get_info (th
, &ti
)) != TD_OK
)
1479 warning ("resume_thread_callback: %s", thr_err_string (ret
));
1480 return -1; /* bail out, get_info failed. */
1483 As things now stand, this should never detect a new thread.
1484 But if it does, we could be in trouble because we aren't calling
1485 wait_thread_callback for it. */
1486 test_for_new_thread (ti
.ti_tid
, ti
.ti_lid
, 1);
1488 if (ti
.ti_lid
!= main_prochandle
.pid
&&
1489 ti
.ti_lid
!= event_pid
)
1491 /* Unconditionally continue the thread with no signal.
1492 Only the event thread will get a signal of any kind. */
1494 target_beneath
->to_resume (ti
.ti_lid
, 0, 0);
1500 new_resume_thread_callback (threadinfo
*thread
, void *data
)
1502 if (thread
->lid
!= event_pid
&&
1503 thread
->lid
!= main_prochandle
.pid
)
1505 /* Unconditionally continue the thread with no signal (for now). */
1507 target_beneath
->to_resume (thread
->lid
, 0, 0);
1512 static int last_resume_pid
;
1513 static int last_resume_step
;
1514 static int last_resume_signo
;
1517 thread_db_resume (int pid
, int step
, enum target_signal signo
)
1519 last_resume_pid
= pid
;
1520 last_resume_step
= step
;
1521 last_resume_signo
= signo
;
1523 /* resuming a specific pid? */
1526 if (is_thread (pid
))
1527 pid
= get_lwp_from_thread_id (GET_THREAD (pid
));
1528 else if (GET_LWP (pid
))
1529 pid
= GET_LWP (pid
);
1532 /* Apparently the interpretation of 'pid' is dependent on 'step':
1533 If step is true, then a specific pid means 'step only this pid'.
1534 But if step is not true, then pid means 'continue ALL pids, but
1535 give the signal only to this one'. */
1536 if (pid
!= -1 && step
)
1538 /* FIXME: is this gonna work in all circumstances? */
1539 target_beneath
->to_resume (pid
, step
, signo
);
1543 /* 1) Continue all threads except the event thread and the main thread.
1544 2) resume the event thread with step and signo.
1545 3) If event thread != main thread, continue the main thread.
1547 Note: order of 2 and 3 may need to be reversed. */
1549 threadlist_iter (new_resume_thread_callback
,
1553 /* now resume event thread, and if necessary also main thread. */
1556 target_beneath
->to_resume (event_pid
, step
, signo
);
1558 if (event_pid
!= main_prochandle
.pid
)
1560 target_beneath
->to_resume (main_prochandle
.pid
, 0, 0);
1565 /* All new threads will be attached.
1566 All previously known threads will be stopped using kill (SIGKILL). */
1569 stop_or_attach_thread_callback (const td_thrhandle_t
*th
, void *data
)
1576 if ((ret
= p_td_thr_get_info (th
, &ti
)) != TD_OK
)
1578 warning ("stop_or_attach_thread_callback: %s", thr_err_string (ret
));
1579 return -1; /* bail out, get_info failed. */
1582 /* First add it to our internal list.
1583 We build this list anew at every wait event. */
1584 insert_thread (ti
.ti_tid
, ti
.ti_lid
, ti
.ti_state
, ti
.ti_type
);
1585 /* Now: if we've already seen it, stop it, else add it and attach it. */
1586 gdb_pid
= BUILD_THREAD (ti
.ti_tid
, main_prochandle
.pid
);
1587 if (!in_thread_list (gdb_pid
)) /* new thread */
1589 handle_new_thread (ti
.ti_tid
, ti
.ti_lid
, 1);
1590 /* Enable thread events */
1591 if (p_td_thr_event_enable
)
1592 if ((ret
= p_td_thr_event_enable (th
, on_off
)) != TD_OK
)
1593 warning ("stop_or_attach_thread: %s", thr_err_string (ret
));
1595 else if (ti
.ti_lid
!= event_pid
&&
1596 ti
.ti_lid
!= main_prochandle
.pid
)
1598 ret
= (td_err_e
) kill (ti
.ti_lid
, SIGSTOP
);
1605 * Wait for signal N from pid PID.
1606 * If wait returns any other signals, put them back before returning.
1610 wait_for_stop (int pid
)
1616 /* Array of wait/signal status */
1617 /* FIXME: wrong data structure, we need a queue.
1618 Realtime signals may be delivered more than once.
1619 And at that, we really can't handle them (see below). */
1621 static int wstatus
[NSIG
];
1622 #elif defined (_NSIG)
1623 static int wstatus
[_NSIG
];
1625 #error No definition for number of signals!
1628 /* clear wait/status list */
1629 memset (&wstatus
, 0, sizeof (wstatus
));
1631 /* Now look for SIGSTOP event on all threads except event thread. */
1634 if (pid
== main_prochandle
.pid
)
1635 retpid
= waitpid (pid
, &status
, 0);
1637 retpid
= waitpid (pid
, &status
, __WCLONE
);
1640 if (WSTOPSIG (status
) == SIGSTOP
)
1642 /* Got the SIGSTOP event we're looking for.
1643 Throw it away, and throw any other events back! */
1644 for (i
= 0; i
< sizeof(wstatus
) / sizeof (wstatus
[0]); i
++)
1650 break; /* all done */
1655 /* Oops, got an event other than SIGSTOP.
1656 Save it, and throw it back after we find the SIGSTOP event. */
1658 /* FIXME (how?) This method is going to fail for realtime
1659 signals, which cannot be put back simply by using kill. */
1661 if (WIFEXITED (status
))
1662 error ("Ack! Thread Exited event. What do I do now???");
1663 else if (WIFSTOPPED (status
))
1664 signo
= WSTOPSIG (status
);
1666 signo
= WTERMSIG (status
);
1668 /* If a thread other than the event thread has hit a GDB
1669 breakpoint (as opposed to some random trap signal), then
1670 just arrange for it to hit it again later. Back up the
1671 PC if necessary. Don't forward the SIGTRAP signal to
1672 the thread. We will handle the current event, eventually
1673 we will resume all the threads, and this one will get
1674 it's breakpoint trap again.
1676 If we do not do this, then we run the risk that the user
1677 will delete or disable the breakpoint, but the thread will
1678 have already tripped on it. */
1680 if (retpid
!= event_pid
&&
1682 breakpoint_inserted_here_p (read_pc_pid (retpid
) -
1683 DECR_PC_AFTER_BREAK
))
1685 /* Set the pc to before the trap and DO NOT re-send the signal */
1686 if (DECR_PC_AFTER_BREAK
)
1687 write_pc_pid (read_pc_pid (retpid
) - DECR_PC_AFTER_BREAK
,
1691 /* Since SIGINT gets forwarded to the entire process group
1692 (in the case where ^C is typed at the tty / console),
1693 just ignore all SIGINTs from other than the event thread. */
1694 else if (retpid
!= event_pid
&& signo
== SIGINT
)
1695 { /* do nothing. Signal will disappear into oblivion! */
1699 else /* This is some random signal other than a breakpoint. */
1701 wstatus
[signo
] = 1;
1703 child_resume (retpid
, 0, TARGET_SIGNAL_0
);
1707 } while (errno
== 0 || errno
== EINTR
);
1711 * wait_thread_callback
1713 * Calls waitpid for each thread, repeatedly if necessary, until
1714 * SIGSTOP is returned. Afterward, if any other signals were returned
1715 * by waitpid, return them to the thread's pending queue by calling kill.
1719 wait_thread_callback (const td_thrhandle_t
*th
, void *data
)
1724 if ((ret
= p_td_thr_get_info (th
, &ti
)) != TD_OK
)
1726 warning ("wait_thread_callback: %s", thr_err_string (ret
));
1727 return -1; /* bail out, get_info failed. */
1730 /* This callback to act on all threads except the event thread: */
1731 if (ti
.ti_lid
== event_pid
|| /* no need to wait (no sigstop) */
1732 ti
.ti_lid
== main_prochandle
.pid
) /* no need to wait (already waited) */
1733 return 0; /* don't wait on the event thread. */
1735 wait_for_stop (ti
.ti_lid
);
1736 return 0; /* finished: next thread. */
1740 new_wait_thread_callback (threadinfo
*thread
, void *data
)
1742 /* don't wait on the event thread -- it's already stopped and waited.
1743 Ditto the main thread. */
1744 if (thread
->lid
!= event_pid
&&
1745 thread
->lid
!= main_prochandle
.pid
)
1747 wait_for_stop (thread
->lid
);
1753 * Wait for any thread to stop, by calling the underlying wait method.
1754 * The PID returned by the underlying target may be a kernel thread,
1755 * in which case we will want to convert it to the corresponding
1756 * user-space thread.
1760 thread_db_wait (int pid
, struct target_waitstatus
*ourstatus
)
1762 td_thrhandle_t thandle
;
1770 /* OK, we're about to wait for an event from the running inferior.
1771 Make sure we're ignoring the right signals. */
1773 check_all_signal_numbers (); /* see if magic signals changed. */
1778 /* FIXME: should I do the wait right here inline? */
1783 lwp
= get_lwp_from_thread_id (GET_THREAD (pid
));
1787 save_errno
= linux_child_wait (-1, &retpid
, &status
);
1788 store_waitstatus (ourstatus
, status
);
1790 /* Thread ID is irrelevant if the target process exited.
1791 FIXME: do I have any killing to do?
1792 Can I get this event mistakenly from a thread? */
1793 if (ourstatus
->kind
== TARGET_WAITKIND_EXITED
)
1796 /* OK, we got an event of interest.
1797 Go stop all threads and look for new ones.
1798 FIXME: maybe don't do this for the restart signal? Optimization... */
1801 /* If the last call to resume was for a specific thread, then we don't
1802 need to stop everyone else: they should already be stopped. */
1803 if (last_resume_step
== 0 || last_resume_pid
== -1)
1805 /* Main thread must be stopped before calling the iterator. */
1806 if (retpid
!= main_prochandle
.pid
)
1808 kill (main_prochandle
.pid
, SIGSTOP
);
1809 wait_for_stop (main_prochandle
.pid
);
1812 empty_threadlist ();
1813 /* Now stop everyone else, and attach any new threads you find. */
1814 p_td_ta_thr_iter (main_threadagent
,
1815 stop_or_attach_thread_callback
,
1818 TD_THR_LOWEST_PRIORITY
,
1820 TD_THR_ANY_USER_FLAGS
);
1822 /* Now go call wait on all the threads we've stopped:
1823 This allows us to absorb the SIGKILL event, and to make sure
1824 that the thread knows that it is stopped (Linux peculiarity). */
1826 threadlist_iter (new_wait_thread_callback
,
1832 /* Convert the kernel thread id to the corresponding thread id. */
1834 /* If the process layer does not furnish an lwp,
1835 then perhaps the returned pid IS the lwp... */
1836 if ((lwp
= GET_LWP (retpid
)) == 0)
1839 if ((ret
= p_td_ta_map_lwp2thr (main_threadagent
, lwp
, &thandle
)) != TD_OK
)
1840 return retpid
; /* LWP is not mapped onto a user-space thread. */
1842 if ((ret
= p_td_thr_validate (&thandle
)) != TD_OK
)
1843 return retpid
; /* LWP is not mapped onto a valid thread. */
1845 if ((ret
= p_td_thr_get_info (&thandle
, &ti
)) != TD_OK
)
1847 warning ("thread_db: thr_get_info failed ('%s')", thr_err_string (ret
));
1851 retpid
= BUILD_THREAD (ti
.ti_tid
, main_prochandle
.pid
);
1852 /* If this is a new user thread, notify GDB about it. */
1853 if (!in_thread_list (retpid
))
1855 printf_filtered ("[New %s]\n", target_pid_to_str (retpid
));
1856 add_thread (retpid
);
1860 /* Now detect if this is a thread creation/deletion event: */
1861 check_for_thread_event (ourstatus
, retpid
);
1867 * kill has to call the underlying kill.
1868 * FIXME: I'm not sure if it's necessary to check inferior_pid any more,
1869 * but we might need to fix inferior_pid up if it's a user thread.
1873 kill_thread_callback (td_thrhandle_t
*th
, void *data
)
1879 For Linux, threads may need to be waited. */
1880 if ((ret
= p_td_thr_get_info (th
, &ti
)) != TD_OK
)
1882 warning ("kill_thread_callback: %s", thr_err_string (ret
));
1883 return -1; /* bail out, get_info failed. */
1886 if (ti
.ti_lid
!= main_prochandle
.pid
)
1888 kill (ti
.ti_lid
, SIGKILL
);
1894 static void thread_db_kill (void)
1900 For Linux, threads may need to be waited. */
1901 if (inferior_pid
!= 0)
1903 /* Go kill the children first. Save the main thread for last. */
1904 p_td_ta_thr_iter (main_threadagent
,
1905 kill_thread_callback
,
1908 TD_THR_LOWEST_PRIORITY
,
1910 TD_THR_ANY_USER_FLAGS
);
1912 /* Turn off thread_db event-reporting API *before* killing the
1913 main thread, since this operation requires child memory access.
1914 Can't move this into thread_db_unpush target because then
1915 detach would not work. */
1916 disable_thread_event_reporting (main_threadagent
);
1918 inferior_pid
= main_prochandle
.pid
;
1921 * Since both procfs_kill and ptrace_kill call target_mourn,
1922 * it should be sufficient for me to call one of them.
1923 * That will result in my mourn being called, which will both
1924 * unpush me and call the underlying mourn.
1926 target_beneath
->to_kill ();
1929 /* Wait for all threads. */
1930 /* FIXME: need a universal wait_for_signal func? */
1933 rpid
= waitpid (-1, &status
, __WCLONE
| WNOHANG
);
1935 while (rpid
> 0 || errno
== EINTR
);
1939 rpid
= waitpid (-1, &status
, WNOHANG
);
1941 while (rpid
> 0 || errno
== EINTR
);
1945 * Mourn has to remove us from the target stack,
1946 * and then call the underlying mourn.
1949 static void thread_db_mourn_inferior (void)
1951 thread_db_unpush_target ();
1952 target_mourn_inferior (); /* call the underlying mourn */
1956 * Detach has to remove us from the target stack,
1957 * and then call the underlying detach.
1959 * But first, it has to detach all the cloned threads!
1963 detach_thread_callback (td_thrhandle_t
*th
, void *data
)
1965 /* Called once per thread. */
1969 if ((ret
= p_td_thr_get_info (th
, &ti
)) != TD_OK
)
1971 warning ("detach_thread_callback: %s", thr_err_string (ret
));
1972 return -1; /* bail out, get_info failed. */
1975 if (!in_thread_list (BUILD_THREAD (ti
.ti_tid
, main_prochandle
.pid
)))
1976 return 0; /* apparently we don't know this one. */
1978 /* Save main thread for last, or the iterator will fail! */
1979 if (ti
.ti_lid
!= main_prochandle
.pid
)
1981 struct cleanup
*old_chain
;
1984 /* Time to detach this thread.
1985 First disable thread_db event reporting for the thread. */
1986 if (p_td_thr_event_enable
&&
1987 (ret
= p_td_thr_event_enable (th
, off
)) != TD_OK
)
1989 warning ("detach_thread_callback: %s\n", thr_err_string (ret
));
1993 /* Now cancel any pending SIGTRAPS. FIXME! */
1995 /* Call underlying detach method. FIXME just detach it. */
1996 old_chain
= save_inferior_pid ();
1997 inferior_pid
= ti
.ti_lid
;
1998 detach (TARGET_SIGNAL_0
);
1999 do_cleanups (old_chain
);
2005 thread_db_detach (char *args
, int from_tty
)
2009 if ((ret
= p_td_ta_thr_iter (main_threadagent
,
2010 detach_thread_callback
,
2013 TD_THR_LOWEST_PRIORITY
,
2015 TD_THR_ANY_USER_FLAGS
))
2017 warning ("detach (thr_iter): %s", thr_err_string (ret
));
2019 /* Turn off thread_db event-reporting API
2020 (before detaching the main thread) */
2021 disable_thread_event_reporting (main_threadagent
);
2023 thread_db_unpush_target ();
2025 /* above call nullifies target_beneath, so don't use that! */
2026 inferior_pid
= PIDGET (inferior_pid
);
2027 target_detach (args
, from_tty
);
2032 * We never want to actually create the inferior!
2034 * If this is ever called, it means we were on the target stack
2035 * when the user said "run". But we don't want to be on the new
2036 * inferior's target stack until the thread_db / libthread
2037 * connection is ready to be made.
2039 * So, what shall we do?
2040 * Unpush ourselves from the stack, and then invoke
2041 * find_default_create_inferior, which will invoke the
2042 * appropriate process_stratum target to do the create.
2046 thread_db_create_inferior (char *exec_file
, char *allargs
, char **env
)
2048 thread_db_unpush_target ();
2049 find_default_create_inferior (exec_file
, allargs
, env
);
2053 * Thread_db target vector initializer.
2057 init_thread_db_ops (void)
2059 thread_db_ops
.to_shortname
= "multi-thread";
2060 thread_db_ops
.to_longname
= "multi-threaded child process.";
2061 thread_db_ops
.to_doc
= "Threads and pthreads support.";
2062 thread_db_ops
.to_files_info
= thread_db_files_info
;
2063 thread_db_ops
.to_create_inferior
= thread_db_create_inferior
;
2064 thread_db_ops
.to_detach
= thread_db_detach
;
2065 thread_db_ops
.to_wait
= thread_db_wait
;
2066 thread_db_ops
.to_resume
= thread_db_resume
;
2067 thread_db_ops
.to_mourn_inferior
= thread_db_mourn_inferior
;
2068 thread_db_ops
.to_kill
= thread_db_kill
;
2069 thread_db_ops
.to_xfer_memory
= thread_db_xfer_memory
;
2070 thread_db_ops
.to_fetch_registers
= thread_db_fetch_registers
;
2071 thread_db_ops
.to_store_registers
= thread_db_store_registers
;
2072 thread_db_ops
.to_thread_alive
= thread_db_alive
;
2073 thread_db_ops
.to_find_new_threads
= thread_db_find_new_threads
;
2074 thread_db_ops
.to_pid_to_str
= thread_db_pid_to_str
;
2075 thread_db_ops
.to_stratum
= thread_stratum
;
2076 thread_db_ops
.to_has_thread_control
= tc_schedlock
;
2077 thread_db_ops
.to_magic
= OPS_MAGIC
;
2079 #endif /* HAVE_STDINT_H */
2082 * Module constructor / initializer function.
2083 * If connection to thread_db dynamic library is successful,
2084 * then initialize this module's target vectors and the
2090 _initialize_thread_db (void)
2092 #ifdef HAVE_STDINT_H /* stub out entire module, leave initializer empty */
2093 if (init_thread_db_library ())
2095 init_thread_db_ops ();
2096 add_target (&thread_db_ops
);
2098 * Hook up to the new_objfile event.
2099 * If someone is already there, arrange for him to be called
2102 target_new_objfile_chain
= target_new_objfile_hook
;
2103 target_new_objfile_hook
= thread_db_new_objfile
;
2105 #endif /* HAVE_STDINT_H */