1 /* libthread_db assisted debugging support, generic parts.
3 Copyright 1999, 2000, 2001, 2003, 2004 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. */
24 #include "gdb_assert.h"
26 #include "gdb_proc_service.h"
27 #include "gdb_thread_db.h"
30 #include "exceptions.h"
31 #include "gdbthread.h"
37 #include "solib-svr4.h"
39 #ifdef HAVE_GNU_LIBC_VERSION_H
40 #include <gnu/libc-version.h>
43 #ifndef LIBTHREAD_DB_SO
44 #define LIBTHREAD_DB_SO "libthread_db.so.1"
47 /* If we're running on GNU/Linux, we must explicitly attach to any new
50 /* FIXME: There is certainly some room for improvements:
52 - Bypass libthread_db when fetching or storing registers for
53 threads bound to a LWP. */
55 /* This module's target vector. */
56 static struct target_ops thread_db_ops
;
58 /* The target vector that we call for things this module can't handle. */
59 static struct target_ops
*target_beneath
;
61 /* Pointer to the next function on the objfile event chain. */
62 static void (*target_new_objfile_chain
) (struct objfile
* objfile
);
64 /* Non-zero if we're using this module's target vector. */
65 static int using_thread_db
;
67 /* Non-zero if we have determined the signals used by the threads
69 static int thread_signals
;
70 static sigset_t thread_stop_set
;
71 static sigset_t thread_print_set
;
73 /* Structure that identifies the child process for the
74 <proc_service.h> interface. */
75 static struct ps_prochandle proc_handle
;
77 /* Connection to the libthread_db library. */
78 static td_thragent_t
*thread_agent
;
80 /* Pointers to the libthread_db functions. */
82 static td_err_e (*td_init_p
) (void);
84 static td_err_e (*td_ta_new_p
) (struct ps_prochandle
* ps
,
86 static td_err_e (*td_ta_map_id2thr_p
) (const td_thragent_t
*ta
, thread_t pt
,
87 td_thrhandle_t
*__th
);
88 static td_err_e (*td_ta_map_lwp2thr_p
) (const td_thragent_t
*ta
,
89 lwpid_t lwpid
, td_thrhandle_t
*th
);
90 static td_err_e (*td_ta_thr_iter_p
) (const td_thragent_t
*ta
,
91 td_thr_iter_f
*callback
, void *cbdata_p
,
92 td_thr_state_e state
, int ti_pri
,
93 sigset_t
*ti_sigmask_p
,
94 unsigned int ti_user_flags
);
95 static td_err_e (*td_ta_event_addr_p
) (const td_thragent_t
*ta
,
96 td_event_e event
, td_notify_t
*ptr
);
97 static td_err_e (*td_ta_set_event_p
) (const td_thragent_t
*ta
,
98 td_thr_events_t
*event
);
99 static td_err_e (*td_ta_event_getmsg_p
) (const td_thragent_t
*ta
,
100 td_event_msg_t
*msg
);
102 static td_err_e (*td_thr_validate_p
) (const td_thrhandle_t
*th
);
103 static td_err_e (*td_thr_get_info_p
) (const td_thrhandle_t
*th
,
104 td_thrinfo_t
*infop
);
105 static td_err_e (*td_thr_getfpregs_p
) (const td_thrhandle_t
*th
,
106 gdb_prfpregset_t
*regset
);
107 static td_err_e (*td_thr_getgregs_p
) (const td_thrhandle_t
*th
,
109 static td_err_e (*td_thr_setfpregs_p
) (const td_thrhandle_t
*th
,
110 const gdb_prfpregset_t
*fpregs
);
111 static td_err_e (*td_thr_setgregs_p
) (const td_thrhandle_t
*th
,
113 static td_err_e (*td_thr_event_enable_p
) (const td_thrhandle_t
*th
,
116 static td_err_e (*td_thr_tls_get_addr_p
) (const td_thrhandle_t
*th
,
118 size_t offset
, void **address
);
120 /* Location of the thread creation event breakpoint. The code at this
121 location in the child process will be called by the pthread library
122 whenever a new thread is created. By setting a special breakpoint
123 at this location, GDB can detect when a new thread is created. We
124 obtain this location via the td_ta_event_addr call. */
125 static CORE_ADDR td_create_bp_addr
;
127 /* Location of the thread death event breakpoint. */
128 static CORE_ADDR td_death_bp_addr
;
130 /* Prototypes for local functions. */
131 static void thread_db_find_new_threads (void);
132 static void attach_thread (ptid_t ptid
, const td_thrhandle_t
*th_p
,
133 const td_thrinfo_t
*ti_p
, int verbose
);
134 static void detach_thread (ptid_t ptid
, int verbose
);
137 /* Building process ids. */
139 #define GET_PID(ptid) ptid_get_pid (ptid)
140 #define GET_LWP(ptid) ptid_get_lwp (ptid)
141 #define GET_THREAD(ptid) ptid_get_tid (ptid)
143 #define is_lwp(ptid) (GET_LWP (ptid) != 0)
144 #define is_thread(ptid) (GET_THREAD (ptid) != 0)
146 #define BUILD_LWP(lwp, pid) ptid_build (pid, lwp, 0)
149 /* Use "struct private_thread_info" to cache thread state. This is
150 a substantial optimization. */
152 struct private_thread_info
154 /* Flag set when we see a TD_DEATH event for this thread. */
155 unsigned int dying
:1;
157 /* Cached thread state. */
158 unsigned int th_valid
:1;
159 unsigned int ti_valid
:1;
167 thread_db_err_str (td_err_e err
)
174 return "generic 'call succeeded'";
176 return "generic error";
178 return "no thread to satisfy query";
180 return "no sync handle to satisfy query";
182 return "no LWP to satisfy query";
184 return "invalid process handle";
186 return "invalid thread handle";
188 return "invalid synchronization handle";
190 return "invalid thread agent";
192 return "invalid key";
194 return "no event message for getmsg";
196 return "FPU register set not available";
198 return "application not linked with libthread";
200 return "requested event is not supported";
202 return "capability not available";
204 return "debugger service failed";
206 return "operation not applicable to";
208 return "no thread-specific data for this thread";
210 return "malloc failed";
212 return "only part of register set was written/read";
214 return "X register set not available for this thread";
216 snprintf (buf
, sizeof (buf
), "unknown thread_db error '%d'", err
);
222 thread_db_state_str (td_thr_state_e state
)
229 return "stopped by debugger";
238 case TD_THR_STOPPED_ASLEEP
:
239 return "stopped by debugger AND blocked";
241 snprintf (buf
, sizeof (buf
), "unknown thread_db state %d", state
);
246 /* A callback function for td_ta_thr_iter, which we use to map all
249 THP is a handle to the current thread; if INFOP is not NULL, the
250 struct thread_info associated with this thread is returned in
253 If the thread is a zombie, TD_THR_ZOMBIE is returned. Otherwise,
254 zero is returned to indicate success. */
257 thread_get_info_callback (const td_thrhandle_t
*thp
, void *infop
)
261 struct thread_info
*thread_info
;
264 err
= td_thr_get_info_p (thp
, &ti
);
266 error (_("thread_get_info_callback: cannot get thread info: %s"),
267 thread_db_err_str (err
));
269 /* Fill the cache. */
270 thread_ptid
= ptid_build (GET_PID (inferior_ptid
), ti
.ti_lid
, ti
.ti_tid
);
271 thread_info
= find_thread_pid (thread_ptid
);
273 /* In the case of a zombie thread, don't continue. We don't want to
274 attach to it thinking it is a new thread. */
275 if (ti
.ti_state
== TD_THR_UNKNOWN
|| ti
.ti_state
== TD_THR_ZOMBIE
)
278 *(struct thread_info
**) infop
= thread_info
;
279 if (thread_info
!= NULL
)
281 memcpy (&thread_info
->private->th
, thp
, sizeof (*thp
));
282 thread_info
->private->th_valid
= 1;
283 memcpy (&thread_info
->private->ti
, &ti
, sizeof (ti
));
284 thread_info
->private->ti_valid
= 1;
286 return TD_THR_ZOMBIE
;
289 if (thread_info
== NULL
)
291 /* New thread. Attach to it now (why wait?). */
292 attach_thread (thread_ptid
, thp
, &ti
, 1);
293 thread_info
= find_thread_pid (thread_ptid
);
294 gdb_assert (thread_info
!= NULL
);
297 memcpy (&thread_info
->private->th
, thp
, sizeof (*thp
));
298 thread_info
->private->th_valid
= 1;
299 memcpy (&thread_info
->private->ti
, &ti
, sizeof (ti
));
300 thread_info
->private->ti_valid
= 1;
303 *(struct thread_info
**) infop
= thread_info
;
308 /* Accessor functions for the thread_db information, with caching. */
311 thread_db_map_id2thr (struct thread_info
*thread_info
, int fatal
)
315 if (thread_info
->private->th_valid
)
318 err
= td_ta_map_id2thr_p (thread_agent
, GET_THREAD (thread_info
->ptid
),
319 &thread_info
->private->th
);
323 error (_("Cannot find thread %ld: %s"),
324 (long) GET_THREAD (thread_info
->ptid
),
325 thread_db_err_str (err
));
328 thread_info
->private->th_valid
= 1;
331 static td_thrinfo_t
*
332 thread_db_get_info (struct thread_info
*thread_info
)
336 if (thread_info
->private->ti_valid
)
337 return &thread_info
->private->ti
;
339 if (!thread_info
->private->th_valid
)
340 thread_db_map_id2thr (thread_info
, 1);
343 td_thr_get_info_p (&thread_info
->private->th
, &thread_info
->private->ti
);
345 error (_("thread_db_get_info: cannot get thread info: %s"),
346 thread_db_err_str (err
));
348 thread_info
->private->ti_valid
= 1;
349 return &thread_info
->private->ti
;
352 /* Convert between user-level thread ids and LWP ids. */
355 thread_from_lwp (ptid_t ptid
)
359 struct thread_info
*thread_info
;
362 if (GET_LWP (ptid
) == 0)
363 ptid
= BUILD_LWP (GET_PID (ptid
), GET_PID (ptid
));
365 gdb_assert (is_lwp (ptid
));
367 err
= td_ta_map_lwp2thr_p (thread_agent
, GET_LWP (ptid
), &th
);
369 error (_("Cannot find user-level thread for LWP %ld: %s"),
370 GET_LWP (ptid
), thread_db_err_str (err
));
374 /* Fetch the thread info. If we get back TD_THR_ZOMBIE, then the
375 event thread has already died. If another gdb interface has called
376 thread_alive() previously, the thread won't be found on the thread list
377 anymore. In that case, we don't want to process this ptid anymore
378 to avoid the possibility of later treating it as a newly
379 discovered thread id that we should add to the list. Thus,
380 we return a -1 ptid which is also how the thread list marks a
382 if (thread_get_info_callback (&th
, &thread_info
) == TD_THR_ZOMBIE
383 && thread_info
== NULL
)
384 return pid_to_ptid (-1);
386 gdb_assert (thread_info
&& thread_info
->private->ti_valid
);
388 return ptid_build (GET_PID (ptid
), GET_LWP (ptid
),
389 thread_info
->private->ti
.ti_tid
);
393 lwp_from_thread (ptid_t ptid
)
395 return BUILD_LWP (GET_LWP (ptid
), GET_PID (ptid
));
400 thread_db_init (struct target_ops
*target
)
402 target_beneath
= target
;
406 verbose_dlsym (void *handle
, const char *name
)
408 void *sym
= dlsym (handle
, name
);
410 warning (_("Symbol \"%s\" not found in libthread_db: %s"), name
, dlerror ());
415 thread_db_load (void)
420 handle
= dlopen (LIBTHREAD_DB_SO
, RTLD_NOW
);
423 fprintf_filtered (gdb_stderr
, "\n\ndlopen failed on '%s' - %s\n",
424 LIBTHREAD_DB_SO
, dlerror ());
425 fprintf_filtered (gdb_stderr
,
426 "GDB will not be able to debug pthreads.\n\n");
430 /* Initialize pointers to the dynamic library functions we will use.
431 Essential functions first. */
433 td_init_p
= verbose_dlsym (handle
, "td_init");
434 if (td_init_p
== NULL
)
437 td_ta_new_p
= verbose_dlsym (handle
, "td_ta_new");
438 if (td_ta_new_p
== NULL
)
441 td_ta_map_id2thr_p
= verbose_dlsym (handle
, "td_ta_map_id2thr");
442 if (td_ta_map_id2thr_p
== NULL
)
445 td_ta_map_lwp2thr_p
= verbose_dlsym (handle
, "td_ta_map_lwp2thr");
446 if (td_ta_map_lwp2thr_p
== NULL
)
449 td_ta_thr_iter_p
= verbose_dlsym (handle
, "td_ta_thr_iter");
450 if (td_ta_thr_iter_p
== NULL
)
453 td_thr_validate_p
= verbose_dlsym (handle
, "td_thr_validate");
454 if (td_thr_validate_p
== NULL
)
457 td_thr_get_info_p
= verbose_dlsym (handle
, "td_thr_get_info");
458 if (td_thr_get_info_p
== NULL
)
461 td_thr_getfpregs_p
= verbose_dlsym (handle
, "td_thr_getfpregs");
462 if (td_thr_getfpregs_p
== NULL
)
465 td_thr_getgregs_p
= verbose_dlsym (handle
, "td_thr_getgregs");
466 if (td_thr_getgregs_p
== NULL
)
469 td_thr_setfpregs_p
= verbose_dlsym (handle
, "td_thr_setfpregs");
470 if (td_thr_setfpregs_p
== NULL
)
473 td_thr_setgregs_p
= verbose_dlsym (handle
, "td_thr_setgregs");
474 if (td_thr_setgregs_p
== NULL
)
477 /* Initialize the library. */
481 warning (_("Cannot initialize libthread_db: %s"), thread_db_err_str (err
));
485 /* These are not essential. */
486 td_ta_event_addr_p
= dlsym (handle
, "td_ta_event_addr");
487 td_ta_set_event_p
= dlsym (handle
, "td_ta_set_event");
488 td_ta_event_getmsg_p
= dlsym (handle
, "td_ta_event_getmsg");
489 td_thr_event_enable_p
= dlsym (handle
, "td_thr_event_enable");
490 td_thr_tls_get_addr_p
= dlsym (handle
, "td_thr_tls_get_addr");
496 enable_thread_event (td_thragent_t
*thread_agent
, int event
, CORE_ADDR
*bp
)
501 /* Get the breakpoint address for thread EVENT. */
502 err
= td_ta_event_addr_p (thread_agent
, event
, ¬ify
);
506 /* Set up the breakpoint. */
507 (*bp
) = gdbarch_convert_from_func_ptr_addr (current_gdbarch
,
508 (CORE_ADDR
) notify
.u
.bptaddr
,
510 create_thread_event_breakpoint ((*bp
));
516 enable_thread_event_reporting (void)
518 td_thr_events_t events
;
521 #ifdef HAVE_GNU_LIBC_VERSION_H
522 const char *libc_version
;
523 int libc_major
, libc_minor
;
526 /* We cannot use the thread event reporting facility if these
527 functions aren't available. */
528 if (td_ta_event_addr_p
== NULL
|| td_ta_set_event_p
== NULL
529 || td_ta_event_getmsg_p
== NULL
|| td_thr_event_enable_p
== NULL
)
532 /* Set the process wide mask saying which events we're interested in. */
533 td_event_emptyset (&events
);
534 td_event_addset (&events
, TD_CREATE
);
536 #ifdef HAVE_GNU_LIBC_VERSION_H
537 /* FIXME: kettenis/2000-04-23: The event reporting facility is
538 broken for TD_DEATH events in glibc 2.1.3, so don't enable it for
540 libc_version
= gnu_get_libc_version ();
541 if (sscanf (libc_version
, "%d.%d", &libc_major
, &libc_minor
) == 2
542 && (libc_major
> 2 || (libc_major
== 2 && libc_minor
> 1)))
544 td_event_addset (&events
, TD_DEATH
);
546 err
= td_ta_set_event_p (thread_agent
, &events
);
549 warning (_("Unable to set global thread event mask: %s"),
550 thread_db_err_str (err
));
554 /* Delete previous thread event breakpoints, if any. */
555 remove_thread_event_breakpoints ();
556 td_create_bp_addr
= 0;
557 td_death_bp_addr
= 0;
559 /* Set up the thread creation event. */
560 err
= enable_thread_event (thread_agent
, TD_CREATE
, &td_create_bp_addr
);
563 warning (_("Unable to get location for thread creation breakpoint: %s"),
564 thread_db_err_str (err
));
568 /* Set up the thread death event. */
569 err
= enable_thread_event (thread_agent
, TD_DEATH
, &td_death_bp_addr
);
572 warning (_("Unable to get location for thread death breakpoint: %s"),
573 thread_db_err_str (err
));
579 disable_thread_event_reporting (void)
581 td_thr_events_t events
;
583 /* Set the process wide mask saying we aren't interested in any
585 td_event_emptyset (&events
);
586 td_ta_set_event_p (thread_agent
, &events
);
588 /* Delete thread event breakpoints, if any. */
589 remove_thread_event_breakpoints ();
590 td_create_bp_addr
= 0;
591 td_death_bp_addr
= 0;
595 check_thread_signals (void)
597 #ifdef GET_THREAD_SIGNALS
603 GET_THREAD_SIGNALS (&mask
);
604 sigemptyset (&thread_stop_set
);
605 sigemptyset (&thread_print_set
);
607 for (i
= 1; i
< NSIG
; i
++)
609 if (sigismember (&mask
, i
))
611 if (signal_stop_update (target_signal_from_host (i
), 0))
612 sigaddset (&thread_stop_set
, i
);
613 if (signal_print_update (target_signal_from_host (i
), 0))
614 sigaddset (&thread_print_set
, i
);
623 thread_db_new_objfile (struct objfile
*objfile
)
627 /* First time through, report that libthread_db was successfuly
628 loaded. Can't print this in in thread_db_load as, at that stage,
629 the interpreter and it's console haven't started. The real
630 problem here is that libthread_db is loaded too early - it should
631 only be loaded when there is a program to debug. */
637 const char *library
= NULL
;
639 if (dladdr ((*td_ta_new_p
), &info
) != 0)
640 library
= info
.dli_fname
;
643 /* Paranoid - don't let a NULL path slip through. */
644 library
= LIBTHREAD_DB_SO
;
645 printf_unfiltered (_("Using host libthread_db library \"%s\".\n"),
651 /* Don't attempt to use thread_db on targets which can not run
653 if (objfile
== NULL
|| !target_has_execution
)
655 /* All symbols have been discarded. If the thread_db target is
656 active, deactivate it now. */
659 gdb_assert (proc_handle
.pid
== 0);
660 unpush_target (&thread_db_ops
);
668 /* Nothing to do. The thread library was already detected and the
669 target vector was already activated. */
672 /* Initialize the structure that identifies the child process. Note
673 that at this point there is no guarantee that we actually have a
675 proc_handle
.pid
= GET_PID (inferior_ptid
);
677 /* Now attempt to open a connection to the thread library. */
678 err
= td_ta_new_p (&proc_handle
, &thread_agent
);
682 /* No thread library was detected. */
686 printf_unfiltered (_("[Thread debugging using libthread_db enabled]\n"));
688 /* The thread library was detected. Activate the thread_db target. */
689 push_target (&thread_db_ops
);
692 enable_thread_event_reporting ();
693 thread_db_find_new_threads ();
697 warning (_("Cannot initialize thread debugging library: %s"),
698 thread_db_err_str (err
));
703 if (target_new_objfile_chain
)
704 target_new_objfile_chain (objfile
);
707 /* Attach to a new thread. This function is called when we receive a
708 TD_CREATE event or when we iterate over all threads and find one
709 that wasn't already in our list. */
712 attach_thread (ptid_t ptid
, const td_thrhandle_t
*th_p
,
713 const td_thrinfo_t
*ti_p
, int verbose
)
715 struct thread_info
*tp
;
718 /* If we're being called after a TD_CREATE event, we may already
719 know about this thread. There are two ways this can happen. We
720 may have iterated over all threads between the thread creation
721 and the TD_CREATE event, for instance when the user has issued
722 the `info threads' command before the SIGTRAP for hitting the
723 thread creation breakpoint was reported. Alternatively, the
724 thread may have exited and a new one been created with the same
725 thread ID. In the first case we don't need to do anything; in
726 the second case we should discard information about the dead
727 thread and attach to the new one. */
728 if (in_thread_list (ptid
))
730 tp
= find_thread_pid (ptid
);
731 gdb_assert (tp
!= NULL
);
733 if (!tp
->private->dying
)
736 delete_thread (ptid
);
739 check_thread_signals ();
741 /* Add the thread to GDB's thread list. */
742 tp
= add_thread (ptid
);
743 tp
->private = xmalloc (sizeof (struct private_thread_info
));
744 memset (tp
->private, 0, sizeof (struct private_thread_info
));
747 printf_unfiltered (_("[New %s]\n"), target_pid_to_str (ptid
));
749 if (ti_p
->ti_state
== TD_THR_UNKNOWN
|| ti_p
->ti_state
== TD_THR_ZOMBIE
)
750 return; /* A zombie thread -- do not attach. */
752 /* Under GNU/Linux, we have to attach to each and every thread. */
754 ATTACH_LWP (BUILD_LWP (ti_p
->ti_lid
, GET_PID (ptid
)), 0);
757 /* Enable thread event reporting for this thread. */
758 err
= td_thr_event_enable_p (th_p
, 1);
760 error (_("Cannot enable thread event reporting for %s: %s"),
761 target_pid_to_str (ptid
), thread_db_err_str (err
));
765 thread_db_attach (char *args
, int from_tty
)
767 target_beneath
->to_attach (args
, from_tty
);
769 /* Destroy thread info; it's no longer valid. */
772 /* The child process is now the actual multi-threaded
773 program. Snatch its process ID... */
774 proc_handle
.pid
= GET_PID (inferior_ptid
);
776 /* ...and perform the remaining initialization steps. */
777 enable_thread_event_reporting ();
778 thread_db_find_new_threads ();
782 detach_thread (ptid_t ptid
, int verbose
)
784 struct thread_info
*thread_info
;
787 printf_unfiltered (_("[%s exited]\n"), target_pid_to_str (ptid
));
789 /* Don't delete the thread now, because it still reports as active
790 until it has executed a few instructions after the event
791 breakpoint - if we deleted it now, "info threads" would cause us
792 to re-attach to it. Just mark it as having had a TD_DEATH
793 event. This means that we won't delete it from our thread list
794 until we notice that it's dead (via prune_threads), or until
795 something re-uses its thread ID. */
796 thread_info
= find_thread_pid (ptid
);
797 gdb_assert (thread_info
!= NULL
);
798 thread_info
->private->dying
= 1;
802 thread_db_detach (char *args
, int from_tty
)
804 disable_thread_event_reporting ();
806 /* There's no need to save & restore inferior_ptid here, since the
807 inferior is supposed to be survive this function call. */
808 inferior_ptid
= lwp_from_thread (inferior_ptid
);
810 /* Forget about the child's process ID. We shouldn't need it
814 target_beneath
->to_detach (args
, from_tty
);
818 clear_lwpid_callback (struct thread_info
*thread
, void *dummy
)
820 /* If we know that our thread implementation is 1-to-1, we could save
821 a certain amount of information; it's not clear how much, so we
822 are always conservative. */
824 thread
->private->th_valid
= 0;
825 thread
->private->ti_valid
= 0;
831 thread_db_resume (ptid_t ptid
, int step
, enum target_signal signo
)
833 struct cleanup
*old_chain
= save_inferior_ptid ();
835 if (GET_PID (ptid
) == -1)
836 inferior_ptid
= lwp_from_thread (inferior_ptid
);
837 else if (is_thread (ptid
))
838 ptid
= lwp_from_thread (ptid
);
840 /* Clear cached data which may not be valid after the resume. */
841 iterate_over_threads (clear_lwpid_callback
, NULL
);
843 target_beneath
->to_resume (ptid
, step
, signo
);
845 do_cleanups (old_chain
);
848 /* Check if PID is currently stopped at the location of a thread event
849 breakpoint location. If it is, read the event message and act upon
853 check_event (ptid_t ptid
)
861 /* Bail out early if we're not at a thread event breakpoint. */
862 stop_pc
= read_pc_pid (ptid
) - DECR_PC_AFTER_BREAK
;
863 if (stop_pc
!= td_create_bp_addr
&& stop_pc
!= td_death_bp_addr
)
866 /* If we are at a create breakpoint, we do not know what new lwp
867 was created and cannot specifically locate the event message for it.
868 We have to call td_ta_event_getmsg() to get
869 the latest message. Since we have no way of correlating whether
870 the event message we get back corresponds to our breakpoint, we must
871 loop and read all event messages, processing them appropriately.
872 This guarantees we will process the correct message before continuing
875 Currently, death events are not enabled. If they are enabled,
876 the death event can use the td_thr_event_getmsg() interface to
877 get the message specifically for that lwp and avoid looping
884 err
= td_ta_event_getmsg_p (thread_agent
, &msg
);
890 error (_("Cannot get thread event message: %s"),
891 thread_db_err_str (err
));
894 err
= td_thr_get_info_p (msg
.th_p
, &ti
);
896 error (_("Cannot get thread info: %s"), thread_db_err_str (err
));
898 ptid
= ptid_build (GET_PID (ptid
), ti
.ti_lid
, ti
.ti_tid
);
903 /* Call attach_thread whether or not we already know about a
904 thread with this thread ID. */
905 attach_thread (ptid
, msg
.th_p
, &ti
, 1);
911 if (!in_thread_list (ptid
))
912 error (_("Spurious thread death event."));
914 detach_thread (ptid
, 1);
919 error (_("Spurious thread event."));
926 thread_db_wait (ptid_t ptid
, struct target_waitstatus
*ourstatus
)
928 extern ptid_t trap_ptid
;
930 if (GET_PID (ptid
) != -1 && is_thread (ptid
))
931 ptid
= lwp_from_thread (ptid
);
933 ptid
= target_beneath
->to_wait (ptid
, ourstatus
);
935 if (proc_handle
.pid
== 0)
936 /* The current child process isn't the actual multi-threaded
937 program yet, so don't try to do any special thread-specific
938 post-processing and bail out early. */
941 if (ourstatus
->kind
== TARGET_WAITKIND_EXITED
)
942 return pid_to_ptid (-1);
944 if (ourstatus
->kind
== TARGET_WAITKIND_STOPPED
945 && ourstatus
->value
.sig
== TARGET_SIGNAL_TRAP
)
946 /* Check for a thread event. */
949 if (!ptid_equal (trap_ptid
, null_ptid
))
950 trap_ptid
= thread_from_lwp (trap_ptid
);
952 /* Change the ptid back into the higher level PID + TID format.
953 If the thread is dead and no longer on the thread list, we will
954 get back a dead ptid. This can occur if the thread death event
955 gets postponed by other simultaneous events. In such a case,
956 we want to just ignore the event and continue on. */
957 ptid
= thread_from_lwp (ptid
);
958 if (GET_PID (ptid
) == -1)
959 ourstatus
->kind
= TARGET_WAITKIND_SPURIOUS
;
965 thread_db_xfer_memory (CORE_ADDR memaddr
, char *myaddr
, int len
, int write
,
966 struct mem_attrib
*attrib
, struct target_ops
*target
)
968 struct cleanup
*old_chain
= save_inferior_ptid ();
971 if (is_thread (inferior_ptid
))
973 /* FIXME: This seems to be necessary to make sure breakpoints
975 if (!target_thread_alive (inferior_ptid
))
976 inferior_ptid
= pid_to_ptid (GET_PID (inferior_ptid
));
978 inferior_ptid
= lwp_from_thread (inferior_ptid
);
982 target_beneath
->deprecated_xfer_memory (memaddr
, myaddr
, len
, write
,
985 do_cleanups (old_chain
);
990 thread_db_fetch_registers (int regno
)
992 struct thread_info
*thread_info
;
994 gdb_prfpregset_t fpregset
;
997 if (!is_thread (inferior_ptid
))
999 /* Pass the request to the target beneath us. */
1000 target_beneath
->to_fetch_registers (regno
);
1004 thread_info
= find_thread_pid (inferior_ptid
);
1005 thread_db_map_id2thr (thread_info
, 1);
1007 err
= td_thr_getgregs_p (&thread_info
->private->th
, gregset
);
1009 error (_("Cannot fetch general-purpose registers for thread %ld: %s"),
1010 (long) GET_THREAD (inferior_ptid
), thread_db_err_str (err
));
1012 err
= td_thr_getfpregs_p (&thread_info
->private->th
, &fpregset
);
1014 error (_("Cannot get floating-point registers for thread %ld: %s"),
1015 (long) GET_THREAD (inferior_ptid
), thread_db_err_str (err
));
1017 /* Note that we must call supply_gregset after calling the thread_db
1018 routines because the thread_db routines call ps_lgetgregs and
1019 friends which clobber GDB's register cache. */
1020 supply_gregset ((gdb_gregset_t
*) gregset
);
1021 supply_fpregset (&fpregset
);
1025 thread_db_store_registers (int regno
)
1027 prgregset_t gregset
;
1028 gdb_prfpregset_t fpregset
;
1030 struct thread_info
*thread_info
;
1032 if (!is_thread (inferior_ptid
))
1034 /* Pass the request to the target beneath us. */
1035 target_beneath
->to_store_registers (regno
);
1039 thread_info
= find_thread_pid (inferior_ptid
);
1040 thread_db_map_id2thr (thread_info
, 1);
1044 char raw
[MAX_REGISTER_SIZE
];
1046 deprecated_read_register_gen (regno
, raw
);
1047 thread_db_fetch_registers (-1);
1048 regcache_raw_supply (current_regcache
, regno
, raw
);
1051 fill_gregset ((gdb_gregset_t
*) gregset
, -1);
1052 fill_fpregset (&fpregset
, -1);
1054 err
= td_thr_setgregs_p (&thread_info
->private->th
, gregset
);
1056 error (_("Cannot store general-purpose registers for thread %ld: %s"),
1057 (long) GET_THREAD (inferior_ptid
), thread_db_err_str (err
));
1058 err
= td_thr_setfpregs_p (&thread_info
->private->th
, &fpregset
);
1060 error (_("Cannot store floating-point registers for thread %ld: %s"),
1061 (long) GET_THREAD (inferior_ptid
), thread_db_err_str (err
));
1065 thread_db_kill (void)
1067 /* There's no need to save & restore inferior_ptid here, since the
1068 inferior isn't supposed to survive this function call. */
1069 inferior_ptid
= lwp_from_thread (inferior_ptid
);
1070 target_beneath
->to_kill ();
1074 thread_db_create_inferior (char *exec_file
, char *allargs
, char **env
,
1077 unpush_target (&thread_db_ops
);
1078 using_thread_db
= 0;
1079 target_beneath
->to_create_inferior (exec_file
, allargs
, env
, from_tty
);
1083 thread_db_post_startup_inferior (ptid_t ptid
)
1085 if (proc_handle
.pid
== 0)
1087 /* The child process is now the actual multi-threaded
1088 program. Snatch its process ID... */
1089 proc_handle
.pid
= GET_PID (ptid
);
1091 /* ...and perform the remaining initialization steps. */
1092 enable_thread_event_reporting ();
1093 thread_db_find_new_threads ();
1098 thread_db_mourn_inferior (void)
1100 remove_thread_event_breakpoints ();
1102 /* Forget about the child's process ID. We shouldn't need it
1104 proc_handle
.pid
= 0;
1106 target_beneath
->to_mourn_inferior ();
1108 /* Detach thread_db target ops. */
1109 unpush_target (&thread_db_ops
);
1110 using_thread_db
= 0;
1114 thread_db_thread_alive (ptid_t ptid
)
1119 if (is_thread (ptid
))
1121 struct thread_info
*thread_info
;
1122 thread_info
= find_thread_pid (ptid
);
1124 thread_db_map_id2thr (thread_info
, 0);
1125 if (!thread_info
->private->th_valid
)
1128 err
= td_thr_validate_p (&thread_info
->private->th
);
1132 if (!thread_info
->private->ti_valid
)
1135 td_thr_get_info_p (&thread_info
->private->th
,
1136 &thread_info
->private->ti
);
1139 thread_info
->private->ti_valid
= 1;
1142 if (thread_info
->private->ti
.ti_state
== TD_THR_UNKNOWN
1143 || thread_info
->private->ti
.ti_state
== TD_THR_ZOMBIE
)
1144 return 0; /* A zombie thread. */
1149 if (target_beneath
->to_thread_alive
)
1150 return target_beneath
->to_thread_alive (ptid
);
1156 find_new_threads_callback (const td_thrhandle_t
*th_p
, void *data
)
1162 err
= td_thr_get_info_p (th_p
, &ti
);
1164 error (_("find_new_threads_callback: cannot get thread info: %s"),
1165 thread_db_err_str (err
));
1167 if (ti
.ti_state
== TD_THR_UNKNOWN
|| ti
.ti_state
== TD_THR_ZOMBIE
)
1168 return 0; /* A zombie -- ignore. */
1170 ptid
= ptid_build (GET_PID (inferior_ptid
), ti
.ti_lid
, ti
.ti_tid
);
1172 if (!in_thread_list (ptid
))
1173 attach_thread (ptid
, th_p
, &ti
, 1);
1179 thread_db_find_new_threads (void)
1183 /* Iterate over all user-space threads to discover new threads. */
1184 err
= td_ta_thr_iter_p (thread_agent
, find_new_threads_callback
, NULL
,
1185 TD_THR_ANY_STATE
, TD_THR_LOWEST_PRIORITY
,
1186 TD_SIGNO_MASK
, TD_THR_ANY_USER_FLAGS
);
1188 error (_("Cannot find new threads: %s"), thread_db_err_str (err
));
1192 thread_db_pid_to_str (ptid_t ptid
)
1194 if (is_thread (ptid
))
1196 static char buf
[64];
1199 struct thread_info
*thread_info
;
1201 thread_info
= find_thread_pid (ptid
);
1202 thread_db_map_id2thr (thread_info
, 0);
1203 if (!thread_info
->private->th_valid
)
1205 snprintf (buf
, sizeof (buf
), "Thread %ld (Missing)",
1210 ti_p
= thread_db_get_info (thread_info
);
1212 if (ti_p
->ti_state
== TD_THR_ACTIVE
&& ti_p
->ti_lid
!= 0)
1214 snprintf (buf
, sizeof (buf
), "Thread %ld (LWP %d)",
1215 (long) ti_p
->ti_tid
, ti_p
->ti_lid
);
1219 snprintf (buf
, sizeof (buf
), "Thread %ld (%s)",
1220 (long) ti_p
->ti_tid
,
1221 thread_db_state_str (ti_p
->ti_state
));
1227 if (target_beneath
->to_pid_to_str (ptid
))
1228 return target_beneath
->to_pid_to_str (ptid
);
1230 return normal_pid_to_str (ptid
);
1233 /* Get the address of the thread local variable in load module LM which
1234 is stored at OFFSET within the thread local storage for thread PTID. */
1237 thread_db_get_thread_local_address (ptid_t ptid
,
1241 if (is_thread (ptid
))
1245 struct thread_info
*thread_info
;
1247 /* glibc doesn't provide the needed interface. */
1248 if (!td_thr_tls_get_addr_p
)
1249 throw_error (TLS_NO_LIBRARY_SUPPORT_ERROR
,
1250 _("No TLS library support"));
1252 /* Caller should have verified that lm != 0. */
1253 gdb_assert (lm
!= 0);
1255 /* Get info about the thread. */
1256 thread_info
= find_thread_pid (ptid
);
1257 thread_db_map_id2thr (thread_info
, 1);
1259 /* Finally, get the address of the variable. */
1260 err
= td_thr_tls_get_addr_p (&thread_info
->private->th
, (void *) lm
,
1263 #ifdef THREAD_DB_HAS_TD_NOTALLOC
1264 /* The memory hasn't been allocated, yet. */
1265 if (err
== TD_NOTALLOC
)
1266 /* Now, if libthread_db provided the initialization image's
1267 address, we *could* try to build a non-lvalue value from
1268 the initialization image. */
1269 throw_error (TLS_NOT_ALLOCATED_YET_ERROR
,
1270 _("TLS not allocated yet"));
1273 /* Something else went wrong. */
1275 throw_error (TLS_GENERIC_ERROR
,
1276 (("%s")), thread_db_err_str (err
));
1278 /* Cast assuming host == target. Joy. */
1279 return (CORE_ADDR
) address
;
1282 if (target_beneath
->to_get_thread_local_address
)
1283 return target_beneath
->to_get_thread_local_address (ptid
, lm
, offset
);
1285 throw_error (TLS_GENERIC_ERROR
,
1286 _("TLS not supported on this target"));
1290 init_thread_db_ops (void)
1292 thread_db_ops
.to_shortname
= "multi-thread";
1293 thread_db_ops
.to_longname
= "multi-threaded child process.";
1294 thread_db_ops
.to_doc
= "Threads and pthreads support.";
1295 thread_db_ops
.to_attach
= thread_db_attach
;
1296 thread_db_ops
.to_detach
= thread_db_detach
;
1297 thread_db_ops
.to_resume
= thread_db_resume
;
1298 thread_db_ops
.to_wait
= thread_db_wait
;
1299 thread_db_ops
.to_fetch_registers
= thread_db_fetch_registers
;
1300 thread_db_ops
.to_store_registers
= thread_db_store_registers
;
1301 thread_db_ops
.deprecated_xfer_memory
= thread_db_xfer_memory
;
1302 thread_db_ops
.to_kill
= thread_db_kill
;
1303 thread_db_ops
.to_create_inferior
= thread_db_create_inferior
;
1304 thread_db_ops
.to_post_startup_inferior
= thread_db_post_startup_inferior
;
1305 thread_db_ops
.to_mourn_inferior
= thread_db_mourn_inferior
;
1306 thread_db_ops
.to_thread_alive
= thread_db_thread_alive
;
1307 thread_db_ops
.to_find_new_threads
= thread_db_find_new_threads
;
1308 thread_db_ops
.to_pid_to_str
= thread_db_pid_to_str
;
1309 thread_db_ops
.to_stratum
= thread_stratum
;
1310 thread_db_ops
.to_has_thread_control
= tc_schedlock
;
1311 thread_db_ops
.to_get_thread_local_address
1312 = thread_db_get_thread_local_address
;
1313 thread_db_ops
.to_magic
= OPS_MAGIC
;
1317 _initialize_thread_db (void)
1319 /* Only initialize the module if we can load libthread_db. */
1320 if (thread_db_load ())
1322 init_thread_db_ops ();
1323 add_target (&thread_db_ops
);
1325 /* Add ourselves to objfile event chain. */
1326 target_new_objfile_chain
= deprecated_target_new_objfile_hook
;
1327 deprecated_target_new_objfile_hook
= thread_db_new_objfile
;