Display names of remote threads

This patch adds support for thread names in the remote protocol, and
updates gdb/gdbserver to use it.  The information is added to the XML
description sent in response to the qXfer:threads:read packet.

gdb/ChangeLog:

	* linux-nat.c (linux_nat_thread_name): Replace implementation by call
	to linux_proc_tid_get_name.
	* nat/linux-procfs.c (linux_proc_tid_get_name): New function,
	implementation inspired by linux_nat_thread_name.
	* nat/linux-procfs.h (linux_proc_tid_get_name): New declaration.
	* remote.c (struct private_thread_info) <name>: New field.
	(free_private_thread_info): Free name field.
	(remote_thread_name): New function.
	(thread_item_t) <name>: New field.
	(clear_threads_listing_context): Free name field.
	(start_thread): Get name xml attribute.
	(thread_attributes): Add "name" attribute.
	(remote_update_thread_list): Copy name field.
	(init_remote_ops): Assign remote_thread_name callback.
	* target.h (target_thread_name): Update comment.
	* NEWS: Mention remote thread name support.

gdb/gdbserver/ChangeLog:

	* linux-low.c (linux_target_ops): Use linux_proc_tid_get_name.
	* server.c (handle_qxfer_threads_worker): Refactor to include thread
	name in reply.
	* target.h (struct target_ops) <thread_name>: New field.
	(target_thread_name): New macro.

gdb/doc/ChangeLog:

	* gdb.texinfo (Thread List Format): Mention thread names.
This commit is contained in:
Simon Marchi 2015-11-26 09:49:04 -05:00
parent 73ede76585
commit 79efa585c5
13 changed files with 142 additions and 46 deletions

View file

@ -437,6 +437,7 @@ struct remote_state
struct private_thread_info
{
char *extra;
char *name;
int core;
};
@ -444,6 +445,7 @@ static void
free_private_thread_info (struct private_thread_info *info)
{
xfree (info->extra);
xfree (info->name);
xfree (info);
}
@ -2141,6 +2143,18 @@ remote_thread_alive (struct target_ops *ops, ptid_t ptid)
return (rs->buf[0] == 'O' && rs->buf[1] == 'K');
}
/* Return a pointer to a thread name if we know it and NULL otherwise.
The thread_info object owns the memory for the name. */
static const char *
remote_thread_name (struct target_ops *ops, struct thread_info *info)
{
if (info->priv != NULL)
return info->priv->name;
return NULL;
}
/* About these extended threadlist and threadinfo packets. They are
variable length packets but, the fields within them are often fixed
length. They are redundent enough to send over UDP as is the
@ -2821,6 +2835,9 @@ typedef struct thread_item
/* The thread's extra info. May be NULL. */
char *extra;
/* The thread's name. May be NULL. */
char *name;
/* The core the thread was running on. -1 if not known. */
int core;
} thread_item_t;
@ -2847,7 +2864,10 @@ clear_threads_listing_context (void *p)
struct thread_item *item;
for (i = 0; VEC_iterate (thread_item_t, context->items, i, item); ++i)
xfree (item->extra);
{
xfree (item->extra);
xfree (item->name);
}
VEC_free (thread_item_t, context->items);
}
@ -2951,6 +2971,9 @@ start_thread (struct gdb_xml_parser *parser,
else
item.core = -1;
attr = xml_find_attribute (attributes, "name");
item.name = attr != NULL ? xstrdup (attr->value) : NULL;
item.extra = 0;
VEC_safe_push (thread_item_t, data->items, &item);
@ -2971,6 +2994,7 @@ end_thread (struct gdb_xml_parser *parser,
const struct gdb_xml_attribute thread_attributes[] = {
{ "id", GDB_XML_AF_NONE, NULL, NULL },
{ "core", GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_ulongest, NULL },
{ "name", GDB_XML_AF_OPTIONAL, NULL, NULL },
{ NULL, GDB_XML_AF_NONE, NULL, NULL }
};
@ -3149,6 +3173,8 @@ remote_update_thread_list (struct target_ops *ops)
info->core = item->core;
info->extra = item->extra;
item->extra = NULL;
info->name = item->name;
item->name = NULL;
}
}
}
@ -12738,6 +12764,7 @@ Specify the serial device it is connected to\n\
remote_ops.to_pass_signals = remote_pass_signals;
remote_ops.to_program_signals = remote_program_signals;
remote_ops.to_thread_alive = remote_thread_alive;
remote_ops.to_thread_name = remote_thread_name;
remote_ops.to_update_thread_list = remote_update_thread_list;
remote_ops.to_pid_to_str = remote_pid_to_str;
remote_ops.to_extra_thread_info = remote_threads_extra_info;