From: John Baldwin <jhb@FreeBSD.org>
To: gdb-patches@sourceware.org
Subject: Re: [PATCH] Fix AIX thread exit events not being reported and UI to show kernel thread ID.
Date: Tue, 30 Apr 2024 09:41:29 -0700 [thread overview]
Message-ID: <e3832037-6218-4e0b-bc85-1555db431bc8@FreeBSD.org> (raw)
In-Reply-To: <CH2PR15MB3544D246F3488FE65C8FED4CD61B2@CH2PR15MB3544.namprd15.prod.outlook.com>
On 4/29/24 4:48 AM, Aditya Kamath1 wrote:
> This is an older version of the patch. Sorry for resending this. Kindly ignore the same. I have sent the latest version in another git send-email.
Please use -v <n> (e.g. '-v 2') with a new version of n each time you use git send-email
to send a new version of a patch. This makes includes the 'n' value in the e-mail
subject making it easier to see which version is the latest version.
> Have a nice day ahead.
>
> Thanks and regards,
> Aditya.
>
> From: Aditya Vidyadhar Kamath <akamath996@gmail.com>
> Date: Monday, 29 April 2024 at 5:11 PM
> To: tom@tromey.com <tom@tromey.com>
> Cc: Ulrich Weigand <Ulrich.Weigand@de.ibm.com>, gdb-patches@sourceware.org <gdb-patches@sourceware.org>, Aditya Kamath1 <Aditya.Kamath1@ibm.com>, Sangamesh Mallayya <sangamesh.swamy@in.ibm.com>
> Subject: [EXTERNAL] [PATCH] Fix AIX thread exit events not being reported and UI to show kernel thread ID.
> From: Aditya Vidyadhar Kamath <Aditya.Kamath1@ibm.com>
>
> In AIX when a thread exits we were not showing that a thread exit event happened
> and GDB continued to keep the terminated threads.
>
> If we have terminated threads then the UI on info threads command will look like
> (gdb) info threads
> Id Target Id Frame
> * 1 Thread 1 (tid 26607979, running) 0xd0611d70 in _p_nsleep () from /usr/lib/libpthreads.a(_shr_xpg5.o)
> 2 Thread 258 (tid 30998799, finished) aix-thread: ptrace (52, 30998799) returned -1 (errno = 3 The process does not exist.)
>
> If we see the frame is not getting displayed correctly.
>
> The reason for the same is that in AIX we were not managing thread states. In particular we do not know
> when a thread terminates.
>
> The reason being in sync_threadlists () the pbuf and gbuf lists remain the same though certain threads exit.
>
> This patch is a fix to the same.
>
> Also certain UI is changed.
>
> On a new thread born and exit the UI in AIX will be similar to Linux with both user and kernel thread information.
>
> [New Thread 258 (tid 32178533)]
> [New Thread 515 (tid 30343651)]
> [New Thread 772 (tid 33554909)]
> [New Thread 1029 (tid 24969489)]
> [New Thread 1286 (tid 18153945)]
> [New Thread 1543 (tid 30736739)]
> [Thread 258 (tid 32178533) exited]
> [Thread 515 (tid 30343651) exited]
> [Thread 772 (tid 33554909) exited]
> [Thread 1029 (tid 24969489) exited]
> [Thread 1286 (tid 18153945) exited]
> [Thread 1543 (tid 30736739) exited]
>
> and info threads will look like
> (gdb) info threads
> Id Target Id Frame
> * 1 Thread 1 (tid 31326579) ([running]) 0xd0611d70 in _p_nsleep () from /usr/lib/libpthread.a(_shr_xpg5.o)
> ---
> gdb/aix-thread.c | 91 ++++++++++++++++++++++++++++++------------------
> 1 file changed, 57 insertions(+), 34 deletions(-)
>
> diff --git a/gdb/aix-thread.c b/gdb/aix-thread.c
> index c70bd82bc24..5ccccf02879 100644
> --- a/gdb/aix-thread.c
> +++ b/gdb/aix-thread.c
> @@ -55,6 +55,7 @@
> #include <sys/reg.h>
> #include <sched.h>
> #include <sys/pthdebug.h>
> +#include <vector>
>
> #if !HAVE_DECL_GETTHRDS
> extern int getthrds (pid_t, struct thrdsinfo64 *, int, tid_t *, int);
> @@ -190,6 +191,9 @@ struct aix_thread_variables
> /* Whether the current architecture is 64-bit.
> Only valid when pd_able is true. */
> int arch64;
> +
> + /* Describes the number of thread born events have been reported. */
> + int threads_reported = 0;
> };
>
> /* Key to our per-inferior data. */
> @@ -740,11 +744,9 @@ state2str (pthdb_state_t state)
> /* qsort() comparison function for sorting pd_thread structs by pthid. */
>
> static int
> -pcmp (const void *p1v, const void *p2v)
> +pcmp (struct pd_thread p1v, struct pd_thread p2v)
> {
> - struct pd_thread *p1 = (struct pd_thread *) p1v;
> - struct pd_thread *p2 = (struct pd_thread *) p2v;
> - return p1->pthid < p2->pthid ? -1 : p1->pthid > p2->pthid;
> + return p1v.pthid < p2v.pthid;
> }
>
> /* ptid comparison function */
> @@ -823,7 +825,6 @@ sync_threadlists (pid_t pid)
> {
> int cmd, status;
> int pcount, psize, pi, gcount, gi;
> - struct pd_thread *pbuf;
> struct thread_info **gbuf, **g, *thread;
> pthdb_pthread_t pdtid;
> pthread_t pthid;
> @@ -831,12 +832,13 @@ sync_threadlists (pid_t pid)
> process_stratum_target *proc_target = current_inferior ()->process_target ();
> struct aix_thread_variables *data;
> data = get_thread_data_helper_for_pid (pid);
> + std::vector<pd_thread> pbuf;
> + struct pd_thread aix_pd_thread;
>
> /* Accumulate an array of libpthdebug threads sorted by pthread id. */
>
> pcount = 0;
> psize = 1;
> - pbuf = XNEWVEC (struct pd_thread, psize);
>
> for (cmd = PTHDB_LIST_FIRST;; cmd = PTHDB_LIST_NEXT)
> {
> @@ -848,27 +850,36 @@ sync_threadlists (pid_t pid)
> if (status != PTHDB_SUCCESS || pthid == PTHDB_INVALID_PTID)
> continue;
>
> - if (pcount == psize)
> - {
> - psize *= 2;
> - pbuf = (struct pd_thread *) xrealloc (pbuf,
> - psize * sizeof *pbuf);
> - }
> - pbuf[pcount].pdtid = pdtid;
> - pbuf[pcount].pthid = pthid;
> + aix_pd_thread.pdtid = pdtid;
> + aix_pd_thread.pthid = pthid;
> + pbuf.push_back (aix_pd_thread);
> pcount++;
> }
>
> - for (pi = 0; pi < pcount; pi++)
> + for (auto it = pbuf.begin (); it != pbuf.end ();)
> {
> - status = pthdb_pthread_tid (data->pd_session, pbuf[pi].pdtid, &tid);
> + status = pthdb_pthread_tid (data->pd_session, (*it).pdtid, &tid);
> if (status != PTHDB_SUCCESS)
> tid = PTHDB_INVALID_TID;
> - pbuf[pi].tid = tid;
> - }
>
> - qsort (pbuf, pcount, sizeof *pbuf, pcmp);
> + (*it).tid = tid;
> + pthdb_state_t state;
> +
> + status = pthdb_pthread_state (data->pd_session, (*it).pdtid, &state);
>
> + /* If the thread is terminated and has not reported its existence
> + or new thread event, then wait for it to report. We want users
> + to know threads were added and then delete. So first add them to
> + pbuf and the next time sync_threadlists is called delete them since
> + data->threads_reported is guarenteed to be greater than 0. */
> +
> + if (state == PST_TERM && data->threads_reported > 0)
> + pbuf.erase (it);
> + else
> + ++it;
> + }
> +
> + std::sort (pbuf.begin (), pbuf.end (), pcmp);
> /* Accumulate an array of GDB threads sorted by pid. */
>
> /* gcount is GDB thread count and pcount is pthreadlib thread count. */
> @@ -881,6 +892,7 @@ sync_threadlists (pid_t pid)
> *g++ = tp;
> qsort (gbuf, gcount, sizeof *gbuf, gcmp);
>
> + pcount = pbuf.size ();
> /* Apply differences between the two arrays to GDB's thread list. */
>
> for (pi = gi = 0; pi < pcount || gi < gcount;)
> @@ -889,6 +901,12 @@ sync_threadlists (pid_t pid)
> {
> delete_thread (gbuf[gi]);
> gi++;
> + data->threads_reported--;
> +
> + /* Since main thread is reported. */
> +
> + if (data->threads_reported == 0)
> + data->threads_reported = 1;
> }
> else if (gi == gcount)
> {
> @@ -901,6 +919,7 @@ sync_threadlists (pid_t pid)
> private_thread_info_up (priv));
>
> pi++;
> + data->threads_reported++;
> }
> else
> {
> @@ -913,7 +932,6 @@ sync_threadlists (pid_t pid)
> tid = pbuf[pi].tid;
>
> cmp_result = ptid_cmp (pptid, gptid);
> -
> if (cmp_result == 0)
> {
> aix_thread_info *priv = get_aix_thread_info (gbuf[gi]);
> @@ -943,6 +961,10 @@ sync_threadlists (pid_t pid)
> {
> delete_thread (gbuf[gi]);
> gi++;
> + data->threads_reported--;
> +
> + if (data->threads_reported == 0)
> + data->threads_reported = 1;
> }
> }
> else
> @@ -954,11 +976,11 @@ sync_threadlists (pid_t pid)
> priv->pdtid = pdtid;
> priv->tid = tid;
> pi++;
> + data->threads_reported++;
> }
> }
> }
>
> - xfree (pbuf);
> xfree (gbuf);
> }
>
> @@ -2084,10 +2106,17 @@ aix_thread_target::thread_alive (ptid_t ptid)
> std::string
> aix_thread_target::pid_to_str (ptid_t ptid)
> {
> - if (ptid.tid () == 0)
> - return beneath ()->pid_to_str (ptid);
> + thread_info *thread_info = current_inferior ()->find_thread (ptid);
> +
> + if (thread_info != NULL && thread_info->priv != NULL)
> + {
> + aix_thread_info *priv = get_aix_thread_info (thread_info);
> +
> + return string_printf (_("Thread %s (tid %s)"), pulongest (ptid.tid ()),
> + pulongest (priv->tid));
> + }
>
> - return string_printf (_("Thread %s"), pulongest (ptid.tid ()));
> + return beneath ()->pid_to_str (ptid);
> }
>
> /* Return a printable representation of extra information about
> @@ -2098,7 +2127,6 @@ aix_thread_target::extra_thread_info (struct thread_info *thread)
> {
> int status;
> pthdb_pthread_t pdtid;
> - pthdb_tid_t tid;
> pthdb_state_t state;
> pthdb_suspendstate_t suspendstate;
> pthdb_detachstate_t detachstate;
> @@ -2115,33 +2143,28 @@ aix_thread_target::extra_thread_info (struct thread_info *thread)
> aix_thread_info *priv = get_aix_thread_info (thread);
>
> pdtid = priv->pdtid;
> - tid = priv->tid;
> -
> - if (tid != PTHDB_INVALID_TID)
> - /* i18n: Like "thread-identifier %d, [state] running, suspended" */
> - buf.printf (_("tid %d"), (int)tid);
>
> status = pthdb_pthread_state (data->pd_session, pdtid, &state);
> if (status != PTHDB_SUCCESS)
> state = PST_NOTSUP;
> - buf.printf (", %s", state2str (state));
> + buf.printf ("[%s]", state2str (state));
>
> status = pthdb_pthread_suspendstate (data->pd_session, pdtid,
> &suspendstate);
> if (status == PTHDB_SUCCESS && suspendstate == PSS_SUSPENDED)
> /* i18n: Like "Thread-Id %d, [state] running, suspended" */
> - buf.printf (_(", suspended"));
> + buf.printf (_("[suspended]"));
>
> status = pthdb_pthread_detachstate (data->pd_session, pdtid,
> &detachstate);
> if (status == PTHDB_SUCCESS && detachstate == PDS_DETACHED)
> /* i18n: Like "Thread-Id %d, [state] running, detached" */
> - buf.printf (_(", detached"));
> + buf.printf (_("[detached]"));
>
> pthdb_pthread_cancelpend (data->pd_session, pdtid, &cancelpend);
> if (status == PTHDB_SUCCESS && cancelpend)
> /* i18n: Like "Thread-Id %d, [state] running, cancel pending" */
> - buf.printf (_(", cancel pending"));
> + buf.printf (_("[cancel pending]"));
>
> buf.write ("", 1);
>
> --
> 2.41.0
--
John Baldwin
next prev parent reply other threads:[~2024-04-30 16:41 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-29 11:40 Aditya Vidyadhar Kamath
2024-04-29 11:48 ` Aditya Kamath1
2024-04-30 16:41 ` John Baldwin [this message]
-- strict thread matches above, loose matches on Subject: below --
2024-04-29 11:46 Aditya Vidyadhar Kamath
2024-04-18 13:26 Aditya Kamath1
2024-04-18 15:03 ` Tom Tromey
2024-04-20 20:59 ` John Baldwin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=e3832037-6218-4e0b-bc85-1555db431bc8@FreeBSD.org \
--to=jhb@freebsd.org \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).