summaryrefslogtreecommitdiffstats
path: root/gnu
diff options
context:
space:
mode:
authorattilio <attilio@FreeBSD.org>2010-11-22 14:42:13 +0000
committerattilio <attilio@FreeBSD.org>2010-11-22 14:42:13 +0000
commit7718cbcbf47164ddaa66a748a050f670b3b37e1d (patch)
tree8831ac1227984e07e03c6ac1b5cf30bba847610f /gnu
parent225a98d4466b7d72ce67e249a3976b499437e798 (diff)
downloadFreeBSD-src-7718cbcbf47164ddaa66a748a050f670b3b37e1d.zip
FreeBSD-src-7718cbcbf47164ddaa66a748a050f670b3b37e1d.tar.gz
Add the ability for GDB to printout the thread name along with other
thread specific informations. In order to do that, and in order to avoid KBI breakage with existing infrastructure the following semantic is implemented: - For live programs, a new member to the PT_LWPINFO is added (pl_tdname) - For cores, a new ELF note is added (NT_THRMISC) that can be used for storing thread specific, miscellaneous, informations. Right now it is just popluated with a thread name. GDB, then, retrieves the correct informations from the corefile via the BFD interface, as it groks the ELF notes and create appropriate pseudo-sections. Sponsored by: Sandvine Incorporated Tested by: gianni Discussed with: dim, kan, kib MFC after: 2 weeks
Diffstat (limited to 'gnu')
-rw-r--r--gnu/usr.bin/gdb/libgdb/fbsd-threads.c47
1 files changed, 44 insertions, 3 deletions
diff --git a/gnu/usr.bin/gdb/libgdb/fbsd-threads.c b/gnu/usr.bin/gdb/libgdb/fbsd-threads.c
index 51890eb..04a96b0 100644
--- a/gnu/usr.bin/gdb/libgdb/fbsd-threads.c
+++ b/gnu/usr.bin/gdb/libgdb/fbsd-threads.c
@@ -426,6 +426,46 @@ fbsd_thread_deactivate (void)
init_thread_list ();
}
+static char *
+fbsd_thread_get_name (lwpid_t lwpid)
+{
+ static char last_thr_name[MAXCOMLEN + 1];
+ char section_name[32];
+ struct ptrace_lwpinfo lwpinfo;
+ bfd_size_type size;
+ struct bfd_section *section;
+
+ if (target_has_execution)
+ {
+ if (ptrace (PT_LWPINFO, lwpid, (caddr_t)&lwpinfo, sizeof (lwpinfo)) == -1)
+ goto fail;
+ strncpy (last_thr_name, lwpinfo.pl_tdname, sizeof (last_thr_name) - 1);
+ }
+ else
+ {
+ snprintf (section_name, sizeof (section_name), ".tname/%u", lwpid);
+ section = bfd_get_section_by_name (core_bfd, section_name);
+ if (! section)
+ goto fail;
+
+ /* Section size fix-up. */
+ size = bfd_section_size (core_bfd, section);
+ if (size > sizeof (last_thr_name))
+ size = sizeof (last_thr_name);
+
+ if (! bfd_get_section_contents (core_bfd, section, last_thr_name,
+ (file_ptr)0, size))
+ goto fail;
+ if (last_thr_name[0] == '\0')
+ goto fail;
+ }
+ last_thr_name[sizeof (last_thr_name) - 1] = '\0';
+ return last_thr_name;
+fail:
+ strcpy (last_thr_name, "<unknown>");
+ return last_thr_name;
+}
+
static void
fbsd_thread_new_objfile (struct objfile *objfile)
{
@@ -1158,7 +1198,7 @@ fbsd_thread_find_new_threads (void)
static char *
fbsd_thread_pid_to_str (ptid_t ptid)
{
- static char buf[64];
+ static char buf[64 + MAXCOMLEN];
if (IS_THREAD (ptid))
{
@@ -1178,8 +1218,9 @@ fbsd_thread_pid_to_str (ptid_t ptid)
if (ti.ti_lid != 0)
{
- snprintf (buf, sizeof (buf), "Thread %llx (LWP %d)",
- (unsigned long long)th.th_thread, ti.ti_lid);
+ snprintf (buf, sizeof (buf), "Thread %llx (LWP %d/%s)",
+ (unsigned long long)th.th_thread, ti.ti_lid,
+ fbsd_thread_get_name (ti.ti_lid));
}
else
{
OpenPOWER on IntegriCloud