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 ...
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.
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
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) _