This is the mail archive of the gdb-prs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug threads/18600] After forking and threads spawning, gdb leaves newly created threads stopped


https://sourceware.org/bugzilla/show_bug.cgi?id=18600

--- Comment #5 from cvs-commit at gcc dot gnu.org <cvs-commit at gcc dot gnu.org> ---
The gdb-7.10-branch branch has been updated by Pedro Alves
<palves@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=7476be08b73fdfba4eb91d891b235d4cf2e70f3b

commit 7476be08b73fdfba4eb91d891b235d4cf2e70f3b
Author: Pedro Alves <palves@redhat.com>
Date:   Thu Jul 30 18:55:36 2015 +0100

    PR threads/18600: Inferiors left around after fork+thread spawn

    The new gdb.threads/fork-plus-threads.exp test exposes one more
    problem.  When one types "info inferiors" after running the program,
    one see's a couple inferior left still, while there should only be
    inferior #1 left.  E.g.:

     (gdb) info inferiors
       Num  Description       Executable
       4    process 8393      /home/pedro/bugs/src/test
       2    process 8388      /home/pedro/bugs/src/test
     * 1    <null>            /home/pedro/bugs/src/test
     (gdb) info threads

    Calling prune_inferiors() manually at this point (from a top gdb) does
    not remove them, because they still have inf->pid != 0 (while they
    shouldn't).  This suggests that we never mourned those inferiors.

    Enabling logs (master + previous patch) we see:

     ...
     WL: waitpid Thread 0x7ffff7fc2740 (LWP 9513) received Trace/breakpoint
trap (stopped)
     WL: Handling extended status 0x03057f
     LHEW: Got clone event from LWP 9513, new child is LWP 9579
     [New Thread 0x7ffff37b8700 (LWP 9579)]
     WL: waitpid Thread 0x7ffff7fc2740 (LWP 9508) received 0 (exited)
     WL: Thread 0x7ffff7fc2740 (LWP 9508) exited.
                            ^^^^^^^^
     [Thread 0x7ffff7fc2740 (LWP 9508) exited]
     WL: waitpid Thread 0x7ffff7fc2740 (LWP 9499) received 0 (exited)
     WL: Thread 0x7ffff7fc2740 (LWP 9499) exited.
     [Thread 0x7ffff7fc2740 (LWP 9499) exited]
     RSRL: resuming stopped-resumed LWP Thread 0x7ffff37b8700 (LWP 9579) at
0x3615ef4ce1: step=0
     ...
     (gdb) info inferiors
       Num  Description       Executable
       5    process 9508      /home/pedro/bugs/src/test
                ^^^^
       4    process 9503      /home/pedro/bugs/src/test
       3    process 9500      /home/pedro/bugs/src/test
       2    process 9499      /home/pedro/bugs/src/test
     * 1    <null>            /home/pedro/bugs/src/test
     (gdb)
     ...

    Note the "Thread 0x7ffff7fc2740 (LWP 9508) exited." line.
    That's this in wait_lwp:

          /* Check if the thread has exited.  */
          if (WIFEXITED (status) || WIFSIGNALED (status))
        {
          thread_dead = 1;
          if (debug_linux_nat)
            fprintf_unfiltered (gdb_stdlog, "WL: %s exited.\n",
                                target_pid_to_str (lp->ptid));
        }
        }

    That was the leader thread reporting an exit, meaning the whole
    process is gone.  So the problem is that this code doesn't understand
    that an WIFEXITED status of the leader LWP should be reported to
    infrun as process exit.

    gdb/ChangeLog:
    2015-07-30  Pedro Alves  <palves@redhat.com>

        PR threads/18600
        * linux-nat.c (wait_lwp): Report to the core when thread group
        leader exits.

    gdb/testsuite/ChangeLog:
    2015-07-30  Pedro Alves  <palves@redhat.com>

        PR threads/18600
        * gdb.threads/fork-plus-threads.exp: Test that "info inferiors"
        only shows inferior 1.

-- 
You are receiving this mail because:
You are on the CC list for the bug.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]