diff options
author | Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> | 2025-02-19 08:55:23 +0100 |
---|---|---|
committer | Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> | 2025-02-19 09:15:44 +0100 |
commit | 1dd0c74551166c07ba0f26d10432ffa577453713 (patch) | |
tree | f1b7c7cc52dbf63b4cf4a7d4bd493302ff405014 /gdb | |
parent | 4546dae1ff089bb4a027929f47240d5de0c370c0 (diff) | |
download | binutils-1dd0c74551166c07ba0f26d10432ffa577453713.zip binutils-1dd0c74551166c07ba0f26d10432ffa577453713.tar.gz binutils-1dd0c74551166c07ba0f26d10432ffa577453713.tar.bz2 |
gdbserver, remote: introduce "id_str" in the "qXfer:threads:read" XML
GDB prints the target id of a thread in various places such as the
output of the "info threads" command in the "Target Id" column or when
switching to a thread. A target can define what to print for a given
ptid by overriding the `pid_to_str` method.
The remote target is a gateway behind which one of many various
targets could be running. The remote target converts a given ptid to
a string in a uniform way, without consulting the low target at the
server-side.
In this patch we introduce a new attribute in the XML that is sent in
response to the "qXfer:threads:read" RSP packet, so that a low target
at the server side, if it wishes, can specify what to print as the
target id of a thread.
Note that the existing "name" attribute or the "extra" text provided
in the XML are not sufficient for the server-side low target to
achieve the goal. Those attributes, when present, are simply appended
to the target id by GDB.
Reviewed-By: Eli Zaretskii <eliz@gnu.org>
Reviewed-By: Thiago Jung Bauermann <thiago.bauermann@linaro.org>
Approved-By: Simon Marchi <simon.marchi@efficios.com>
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/NEWS | 8 | ||||
-rw-r--r-- | gdb/doc/gdb.texinfo | 7 | ||||
-rw-r--r-- | gdb/remote.c | 26 |
3 files changed, 38 insertions, 3 deletions
@@ -62,6 +62,14 @@ binary-upload in qSupported reply stub doesn't report this feature supported, then GDB will not use the 'x' packet. +* Changed remote packets + +qXfer:threads:read + The XML that is sent as a response can now include an "id_str" + attribute for a thread element. The attribute indicates what GDB + should print as the target ID of the thread, for example in the + "info threads" command or when switching to the thread. + * MI changes ** The =library-unloaded event now includes the 'ranges' field, which diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 88b6c68..f8a8b13 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -48444,7 +48444,7 @@ the following structure: @smallexample <?xml version="1.0"?> <threads> - <thread id="id" core="0" name="name" handle="1a2b3c"> + <thread id="id" core="0" name="name" id_str="Thread 12.34" handle="1a2b3c"> ... description ... </thread> </threads> @@ -48456,7 +48456,10 @@ identifies the thread (@pxref{thread-id syntax}). The the thread was last executing on. The @samp{name} attribute, if present, specifies the human-readable name of the thread. The content of the of @samp{thread} element is interpreted as human-readable -auxiliary information. The @samp{handle} attribute, if present, +auxiliary information. The @samp{id_str} attribute, if present, +specifies what @value{GDBN} should print as the target ID of the +thread (e.g.@: in the @samp{info threads} command or when switching +to the thread). The @samp{handle} attribute, if present, is a hex encoded representation of the thread handle. diff --git a/gdb/remote.c b/gdb/remote.c index 1318352..98a94fa 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -1623,6 +1623,12 @@ struct remote_thread_info : public private_thread_info std::string name; int core = -1; + /* The string representation for the thread's id. + + The target specifies this if they want to display the thread id + in a specific way. If empty, the default approach is used. */ + std::string id_str; + /* Thread handle, perhaps a pthread_t or thread_t value, stored as a sequence of bytes. */ gdb::byte_vector thread_handle; @@ -4030,6 +4036,9 @@ struct thread_item /* The thread's name. */ std::string name; + /* The thread's id, translated to a string for displaying. */ + std::string id_str; + /* The core the thread was running on. -1 if not known. */ int core = -1; @@ -4156,6 +4165,10 @@ start_thread (struct gdb_xml_parser *parser, if (attr != NULL) item.name = (const char *) attr->value.get (); + attr = xml_find_attribute (attributes, "id_str"); + if (attr != nullptr) + item.id_str = (const char *) attr->value.get (); + attr = xml_find_attribute (attributes, "handle"); if (attr != NULL) item.thread_handle = hex2bin ((const char *) attr->value.get ()); @@ -4177,6 +4190,7 @@ 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 }, + { "id_str", GDB_XML_AF_OPTIONAL, NULL, NULL }, { "handle", GDB_XML_AF_OPTIONAL, NULL, NULL }, { NULL, GDB_XML_AF_NONE, NULL, NULL } }; @@ -4361,6 +4375,7 @@ remote_target::update_thread_list () info->core = item.core; info->extra = std::move (item.extra); info->name = std::move (item.name); + info->id_str = std::move (item.id_str); info->thread_handle = std::move (item.thread_handle); } } @@ -12392,7 +12407,16 @@ remote_target::pid_to_str (ptid_t ptid) { if (magic_null_ptid == ptid) return "Thread <main>"; - else if (m_features.remote_multi_process_p ()) + + thread_info *thread = this->find_thread (ptid); + if ((thread != nullptr) && (thread->priv != nullptr)) + { + remote_thread_info *priv = get_remote_thread_info (thread); + if (!priv->id_str.empty ()) + return priv->id_str; + } + + if (m_features.remote_multi_process_p ()) if (ptid.lwp () == 0) return normal_pid_to_str (ptid); else |