public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Aditya Kamath1 <Aditya.Kamath1@ibm.com>
To: Ulrich Weigand <Ulrich.Weigand@de.ibm.com>,
	"simark@simark.ca" <simark@simark.ca>,
	"gdb-patches@sourceware.org" <gdb-patches@sourceware.org>
Cc: Sangamesh Mallayya <sangamesh.swamy@in.ibm.com>
Subject: Re: [PATCH] 0001-Fix-multi-thread-debug-bug-in-AIX.patch
Date: Tue, 8 Nov 2022 12:00:18 +0000	[thread overview]
Message-ID: <CH2PR15MB3544280C0A0B3D7F2F35BD0FD63F9@CH2PR15MB3544.namprd15.prod.outlook.com> (raw)
In-Reply-To: <0866c91331b08f2870fad6e6a13fbcd1a9823b48.camel@de.ibm.com>


[-- Attachment #1.1: Type: text/plain, Size: 3999 bytes --]

Hi Ulrich,


>You should find out why the "priv" field isn't
>set up correctly, and fix whatever was going
>wrong there.  (I believe this should have been
>done in sync_threadlists.)

You were right about this. What is happening is the main process and the thread representing it are treated as two separate threads by the libpthread library. Main process had no private data set whereas the thread representing it had. Usually, both of them should have it and their private data must be the same.

For example ,

Consider the program below:- [ Program Credits:-  GDB test case continue-pending-status.c]


#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <pthread.h>

#include <assert.h>


pthread_barrier_t barrier;


#define NUM_THREADS 2


void *

thread_function (void *arg)

{



  pthread_barrier_wait (&barrier);


  while (1); /* break here */

}


int

main (void)

{

  int i;


  alarm (300);


  pthread_barrier_init (&barrier, NULL, NUM_THREADS);


  for (i = 0; i < NUM_THREADS; i++)

    {

      pthread_t thread;

      int res;


      res = pthread_create (&thread, NULL,

                            thread_function, NULL);

      assert (res == 0);

    }

  while (1)

    sleep (1);


  return 0;

}

Here is the gdb output of the above code,  Clearly when I switched to thread 2 which same as thread1 and interrupted, thread 1 received the input. So, when we added a private data in sync_threadlists() we added for thread 2 but not 1 which is main thread and same as thread 1. This is why we got that assertion failure as thread 1 did not have a private data.


Reading symbols from /home/XYZ/gdb_tests/continue-pending-status...

(gdb) r

Starting program: /home/XYZ/gdb_tests/continue-pending-status

[New Thread 1]

^C[New Thread 258]

[New Thread 515]


Thread 1 received signal SIGINT, Interrupt.

0xd0595fb0 in _p_nsleep () from /usr/lib/libpthread.a(shr_xpg5.o)

(gdb) info threads

  Id   Target Id                          Frame

* 1    process 12059046                   0xd0595fb0 in _p_nsleep () from /usr/lib/libpthread.a(shr_xpg5.o)

  2    Thread 1 (tid 39125487, running)   0xd0595fb0 in _p_nsleep () from /usr/lib/libpthread.a(shr_xpg5.o)

  3    Thread 258 (tid 23396809, running) thread_function (arg=0x0) at continue-pending-status.c:36

  4    Thread 515 (tid 36503883, running) thread_function (arg=warning: (Internal error: pc 0x0 in read in psymtab, but not in symtab.)


0x0) at continue-pending-status.c:36

(gdb) thread 2

[Switching to thread 2 (Thread 1)]

#0  0xd0595fb0 in _p_nsleep () from /usr/lib/libpthread.a(shr_xpg5.o)

(gdb) c

Continuing.

^C

Thread 1 received signal SIGINT, Interrupt.

[Switching to process 12059046]

0xd0595fb0 in _p_nsleep () from /usr/lib/libpthread.a(shr_xpg5.o)

(gdb)

I have written my comments in the patch. Hope this works and if it is right kindly push the same in git, otherwise Let me know what you think.

Have a nice day ahead.

Thanks and regards,
Aditya.
________________________________
From: Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
Sent: 28 October 2022 15:19
To: simark@simark.ca <simark@simark.ca>; Aditya Kamath1 <Aditya.Kamath1@ibm.com>; gdb-patches@sourceware.org <gdb-patches@sourceware.org>
Cc: Sangamesh Mallayya <sangamesh.swamy@in.ibm.com>
Subject: Re: [PATCH] 0001-Fix-multi-thread-debug-bug-in-AIX.patch

Aditya Kamath1 <Aditya.Kamath1@ibm.com> wrote:

> static aix_thread_info *
> get_aix_thread_info (thread_info *thread)
> {
>+  if (thread->priv == NULL)
>+    return NULL;

This doesn't look right.  Note that all users of
get_aix_thread_info assume the pointer returned
from there is never NULL.

You should find out why the "priv" field isn't
set up correctly, and fix whatever was going
wrong there.  (I believe this should have been
done in sync_threadlists.)

Bye,
Ulrich


[-- Attachment #2: 0001-Fix-Multi-thread-debug-bug-fix-in-AIX.patch --]
[-- Type: application/octet-stream, Size: 2022 bytes --]

From 32fc5ec2fa9c5431e1b5718ff8ab36467fb0e1cb Mon Sep 17 00:00:00 2001
From: Aditya Vidyadhar Kamath <Aditya.Kamath1@ibm.com>
Date: Tue, 8 Nov 2022 05:27:44 -0600
Subject: [PATCH] Fix Multi thread debug bug fix in AIX

In the recent commit 98ed24fb35d89eb20179edf6c12f599c7a9e228e made by Mr. Tom there is a change in aix-thread.c file that changes

static_cast <aix_thread_info *> in gdb to gdb::checked_static_cast <aix_thread_info *>

AIX folks using the latest version will not be able to debug multi thread programs as a result of it

The error in AIX is as follows:-

internal-error: checked_static_cast: Assertion 'result != nullptr' failed.

The reason is that once the threads are syncronised with sync_threadlists () and threads are added with priv -

We iterate over threads to get the thread who caused the event and return its ptid

However the pthreadlib library treats the main process and its thread as separate threads though they are one thread.

This patch is a fix for the same.
---
 gdb/aix-thread.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/gdb/aix-thread.c b/gdb/aix-thread.c
index e556c153576..07190543973 100644
--- a/gdb/aix-thread.c
+++ b/gdb/aix-thread.c
@@ -816,6 +816,19 @@ sync_threadlists (int pid)
 					 ptid_t (pid, 0, pbuf[pi].pthid),
 					 priv);
 
+	  /* When the new thread is added and the pthread library is 
+             initialised, the process is threaded but in the 
+             libpthread library it will be counted as two threads
+             one with the main process and second one with the thread
+             that is added.  The main process thread needs to have a
+             private data.  The thread we added will have but main 
+             process will not. Hence the below chunk code does this.  */
+
+          inferior *inf = find_inferior_pid (proc_target, pid);
+          for (thread_info *tp : inf->threads ())
+            if (tp->priv == NULL)
+              tp->priv.reset (priv); 
+
 	  pi++;
 	}
       else
-- 
2.31.1


  reply	other threads:[~2022-11-08 12:00 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-25  6:47 Aditya Kamath1
2022-10-28  9:49 ` Ulrich Weigand
2022-11-08 12:00   ` Aditya Kamath1 [this message]
2022-11-08 12:17     ` Ulrich Weigand
2022-11-13 18:15       ` Aditya Kamath1
2022-11-15 18:16         ` Ulrich Weigand
2022-11-21  8:27           ` Aditya Kamath1
2022-11-23 14:15             ` Ulrich Weigand
2022-11-23 16:03               ` Aditya Kamath1
2022-11-23 17:09                 ` Ulrich Weigand
2022-11-23 18:45                   ` Aditya Kamath1
2022-11-29  8:18                     ` Aditya Kamath1
2022-11-30 14:57                       ` Ulrich Weigand
2022-12-02  7:50                         ` Aditya Kamath1
2022-12-05 18:33                           ` Ulrich Weigand
2022-12-08 10:28                             ` Aditya Kamath1
2022-12-08 10:46                               ` Aditya Kamath1
2022-12-08 16:29                               ` Ulrich Weigand
2022-12-15 12:58                                 ` Aditya Kamath1
2022-12-15 15:53                                   ` Ulrich Weigand
2022-12-19  6:30                                     ` Aditya Kamath1
2022-12-22 12:50                                       ` Ulrich Weigand
2022-12-26 13:18                                         ` Aditya Kamath1
2023-01-09 14:04                                           ` Ulrich Weigand
2023-01-10 12:23                                             ` Aditya Kamath1
2023-01-11 13:31                                               ` Ulrich Weigand
2023-01-13 14:06                                                 ` Aditya Kamath1
2023-01-20 14:44                                                   ` Ulrich Weigand
2023-01-27 14:40                                                     ` Aditya Kamath1
2023-01-30 19:54                                                       ` Tom Tromey
2023-02-02  6:24                                                       ` Aditya Kamath1
2023-02-02  6:35                                                         ` Aditya Kamath1
2023-02-02 17:43                                                           ` Ulrich Weigand
2023-02-03 11:10                                                             ` Aditya Kamath1
2023-02-06 19:07                                                               ` Ulrich Weigand
2023-02-07 11:57                                                                 ` Aditya Kamath1
2023-02-08 18:44                                                                   ` Ulrich Weigand
2023-02-10 16:33                                                                     ` Aditya Kamath1
2023-02-10 16:46                                                                       ` Aditya Kamath1
2023-02-13 19:01                                                                       ` Ulrich Weigand
2023-02-14 14:13                                                                         ` Aditya Kamath1
2023-02-16 19:46                                                                           ` Ulrich Weigand
2023-02-17 11:26                                                                             ` Aditya Kamath1
2023-02-17 12:04                                                                               ` Ulrich Weigand
2023-02-17 13:22                                                                                 ` Aditya Kamath1
2023-02-17 14:18                                                                                   ` Ulrich Weigand
2023-02-17 15:15                                                                                     ` Aditya Kamath1
2023-02-17 19:14                                                                                       ` Ulrich Weigand
2022-11-08 12:00 Aditya Kamath1

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=CH2PR15MB3544280C0A0B3D7F2F35BD0FD63F9@CH2PR15MB3544.namprd15.prod.outlook.com \
    --to=aditya.kamath1@ibm.com \
    --cc=Ulrich.Weigand@de.ibm.com \
    --cc=gdb-patches@sourceware.org \
    --cc=sangamesh.swamy@in.ibm.com \
    --cc=simark@simark.ca \
    /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).