Bug 10970 - GDB hangs when main thread does pthread_exit
Summary: GDB hangs when main thread does pthread_exit
Status: RESOLVED FIXED
Alias: None
Product: gdb
Classification: Unclassified
Component: threads (show other bugs)
Version: 6.8
: P2 normal
Target Milestone: 7.1
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2009-11-17 05:35 UTC by Paul Pluzhnikov
Modified: 2011-05-27 16:58 UTC (History)
2 users (show)

See Also:
Host: x86_64-unknown-linux-gnu
Target: x86_64-unknown-linux-gnu
Build: x86_64-unknown-linux-gnu
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Paul Pluzhnikov 2009-11-17 05:35:15 UTC
Test case:

--- cut ---
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

void *
fn (void *p)
{
  int i;
  printf ("thread %p\n", (void *) pthread_self ());
  for (i = 0; i < 60; ++i)
    {
      printf ("i = %d\n", i);
      sleep (1);
    }
  printf ("thread %p done\n", (void *) pthread_self ());
  return NULL;
}

int main ()
{
  pthread_t tid;
  pthread_create (&tid, NULL, fn, NULL);
  pthread_exit (0);
}
--- cut ---

gcc -g -pthread hang.c -o hang
gdb-cvs -nx ./hang
NU gdb (GDB) 7.0.50.20091116-cvs
...
This GDB was configured as "x86_64-unknown-linux-gnu".
...
Reading symbols from /usr/local/google/tmp/hang...done.
(gdb) run
Starting program: /usr/local/google/tmp/hang 
[Thread debugging using libthread_db enabled]
[New Thread 0x40800950 (LWP 1540)]
thread 0x40800950
i = 0
i = 1
i = 2
i = 3
i = 4
       <<< hit Control-C here; the counter stops, but there is no GDB prompt.
   The only way to "recover" is "killall -9 gdb-cvs" in another window, at which
point inferior resumes (in the background):

i = 5
Killed
$ i = 6
i = 7
i = 8
...
Comment 1 Paul Pluzhnikov 2009-11-17 05:44:53 UTC
Same result with breakpoints as well:

gdb64-cvs -q -nx ./hang
Reading symbols from /usr/local/google/tmp/multiple-so/hang...done.
(gdb) list
13	      sleep (1);
14	    }
15	  printf ("thread %p done\n", (void *) pthread_self ());
16	  return NULL;
17	}
18	
19	int main ()
20	{
21	  pthread_t tid;
22	  pthread_create (&tid, NULL, fn, NULL);
(gdb) b 13
Breakpoint 1 at 0x400686: file hang.c, line 13.
(gdb) r
Starting program: /usr/local/google/tmp/hang 
[Thread debugging using libthread_db enabled]
[New Thread 0x40800950 (LWP 2631)]
thread 0x40800950
i = 0
[Switching to Thread 0x40800950 (LWP 2631)]

Breakpoint 1, fn (p=0x0) at hang.c:13
13	      sleep (1);
(gdb) c
Continuing.
i = 1
      <<< no further progress from here; can't gain GDB prompt with Control-C.

I verified that if I replace pthread_exit() with sleep(300), GDB starts working
fine.
Comment 2 Sourceware Commits 2011-05-27 16:55:43 UTC
CVSROOT:	/cvs/src
Module name:	src
Changes by:	jkratoch@sourceware.org	2011-05-27 16:55:39

Modified files:
	gdb            : ChangeLog linux-nat.c 
	gdb/testsuite  : ChangeLog 
Added files:
	gdb/testsuite/gdb.threads: leader-exit.c leader-exit.exp 

Log message:
	gdb/
	Fix PR 10970, PR 12702.
	* linux-nat.c (linux_lwp_is_zombie): New function.
	(wait_lwp): Initialize status.  New variable prev_mask.  Block signals.
	Check for linux_lwp_is_zombie.  Use WNOHANG and sigsuspend.
	
	gdb/testsuite/
	* gdb.threads/leader-exit.c: New file.
	* gdb.threads/leader-exit.exp: New file.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/ChangeLog.diff?cvsroot=src&r1=1.13060&r2=1.13061
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/linux-nat.c.diff?cvsroot=src&r1=1.205&r2=1.206
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/testsuite/ChangeLog.diff?cvsroot=src&r1=1.2728&r2=1.2729
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/testsuite/gdb.threads/leader-exit.c.diff?cvsroot=src&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/testsuite/gdb.threads/leader-exit.exp.diff?cvsroot=src&r1=NONE&r2=1.1
Comment 3 Jan Kratochvil 2011-05-27 16:58:20 UTC
Fixed.

i = 4
[Thread 0x7ffff7fe6720 (LWP 5622) exited]

Program received signal SIGINT, Interrupt.
[Switching to Thread 0x7ffff7822700 (LWP 5625)]
0x00007ffff78d0ced in nanosleep () at ../sysdeps/unix/syscall-template.S:82
82	T_PSEUDO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS)
(gdb) _