Re: Solaris - procfs: couldn't find pid 32748 (kernel thread 21) in procinfo list

Petr Sumbera via Gdb <[email protected]>
Newsgroups gmane.comp.gdb.devel
Organization Oracle Corporation
Message-ID <[email protected]>
On 02.06.2020 16:53, Pedro Alves wrote:
> On 6/2/20 8:32 AM, Petr Sumbera via Gdb wrote:
>> On 01.06.2020 21:12, Pedro Alves wrote:
>>> On 6/1/20 12:39 PM, Petr Sumbera via Gdb wrote:
>>>> The issue seems to be that the LWP exits and the status->kind is set to TARGET_WAITKIND_SPURIOUS:
>>>>
>>>> https://sourceware.org/git/?p=binutils-gdb.git;a=blob;f=gdb/procfs.c;h=f6c6b0e71c16224d3e7345ca09e011cdcf06349a;hb=HEAD#l2214
>>>>
>>>> But instantly it's added into the list again here:
>>>>
>>>> https://sourceware.org/git/?p=binutils-gdb.git;a=blob;f=gdb/infrun.c;h=95fc3bfe45930b53c33cb4de165db9c070449ad8;hb=HEAD#l5200
>>>>
>>>> But there is no longer such LWP in /proc.
>>>>
>>>> Any suggestion?
>>
>> Thanks for looking at it!
>>
>>> Either:
>>>
>>> - replace TARGET_WAITKIND_SPURIOUS with TARGET_WAITKIND_THREAD_EXITED, or,
>>
>> With this I'm getting:
>>
>> [LWP    21         exited]
>> [LWP    21         exited]
>> /builds/psumbera/userland-gdb-procinfo/components/gdb/gdb-9.2/gdb/thread.c:459: internal-error: void delete_thread_1(thread_info*, bool): Assertion `thr != nullptr' failed.
>> A problem internal to GDB has been detected,
>> further debugging may prove unreliable.
>>
>>> - replace
>>>       status->kind = TARGET_WAITKIND_SPURIOUS;
>>>       return retval;
>>>     with
>>>       goto wait_again;
>>>     instead.
>>
>> and with this:
>>
>> [LWP    20         exited]
>> [LWP    20         exited]
>> /builds/psumbera/userland-gdb-procinfo/components/gdb/gdb-9.2/gdb/thread.c:459: internal-error: void delete_thread_1(thread_info*, bool): Assertion `thr != nullptr' failed.
>> A problem internal to GDB has been detected,
>> further debugging may prove unreliable.
>>
>> -- 
>>
>> Note that in both cases there are TWO exits for one LWP. But LWP numbers differ.
> 
> You mean, it was 21 in one run, and 20 in another run?
> Those were two different runs, and some timing difference
> probably tweaked the order of which thread exits first or
> something.  Doesn't seem unusual.
> 
> Sounds like the patch below would fix it.

Unfortunately no.

> But why do we get two exits in a row for each LWP?  Oh, I guess
> once for PR_SYSENTRY of the exit syscall, and another time for
> PR_SYSEXIT.

Only PR_SYSENTRY is called for my test case (the first occurrence of 
'exited]' - I changed that strings to distinguish between each other).

>  From 0be6c82e754dd676e9f1259ab0f9a7849d985ffd Mon Sep 17 00:00:00 2001
> From: Pedro Alves <[email protected]>
> Date: Tue, 2 Jun 2020 15:44:54 +0100
> Subject: [PATCH] fix-solaris
> 
> ---
>   gdb/procfs.c | 7 ++++---
>   1 file changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/gdb/procfs.c b/gdb/procfs.c
> index f6c6b0e71c1..e2042f3edc4 100644
> --- a/gdb/procfs.c
> +++ b/gdb/procfs.c
> @@ -2331,9 +2331,10 @@ procfs_target::wait (ptid_t ptid, struct target_waitstatus *status,
>   		    if (print_thread_events)
>   		      printf_unfiltered (_("[%s exited]\n"),
>   					 target_pid_to_str (retval).c_str ());
> -		    delete_thread (find_thread_ptid (this, retval));
> -		    status->kind = TARGET_WAITKIND_SPURIOUS;
> -		    return retval;
> +		    thread_info *thr = find_thread_ptid (this, retval);
> +		    if (thr != nullptr)
> +		      delete_thread (thr);
> +		    goto wait_again;
>   		  }
>   		else if (0)
>   		  {
> 
> base-commit: f6eee2d098049afd18f90b8f4bb6a5d1a49d900c
> 

I have modified your change to gdb 9.2 and to correct occurrence (you 
have added it to second occurrence of 'exited'):

--- ../../gdb-9.2/gdb/procfs.c.orig     2020-06-02 17:10:32.057735432 +0000
+++ ../../gdb-9.2/gdb/procfs.c  2020-06-02 18:02:45.496117117 +0000
@@ -2207,9 +2207,10 @@
                     if (print_thread_events)
                       printf_unfiltered (_("[%s exited]\n"),
                                          target_pid_to_str 
(retval).c_str ());
-                   delete_thread (find_thread_ptid (retval));
-                   status->kind = TARGET_WAITKIND_SPURIOUS;
-                   return retval;
+                   thread_info *thr = find_thread_ptid (retval);
+                   if (thr)
+                     delete_thread (thr);
+                   goto wait_again;
                   }
                 else if (syscall_is_exit (pi, what))
                   {

But this time exited message repeats forever:

[LWP    24         exited]
[LWP    24         exited]
[LWP    24         exited]
..

---

Petr
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.