This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc 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]

Defunct threads on Alpha with linuxthreads


Hi,

There already is a bug about this issue:

http://sources.redhat.com/bugzilla/show_bug.cgi?id=1297

Basically with 2.4 or 2.6 kernels, glibc-2.3.[45] and linuxthreads,
there are issues with cleaning up the threads, and you get a defunct
process.

----- test case -----
#include <pthread.h>
#include <unistd.h>

void myThread(void *foo) {
	pthread_exit(foo);
}

int main()
{
	pthread_t tt;
	pthread_attr_t ta;

	pthread_attr_init(&ta);
	pthread_attr_setdetachstate(&ta, PTHREAD_CREATE_DETACHED);

	pthread_create(&tt, &ta, (void* (*) (void*))myThread, (void*)NULL);

	sleep(600);

	return 0;
}
-----

Above code does the following:

-----
root      4541  0.0  0.1   4448   648 pts/0    S+   01:32   0:00 /root/pthread-test
root      4542  0.0  0.1   4448   648 pts/0    S+   01:32   0:00 /root/pthread-test
root      4543  0.0  0.0      0     0 pts/0    Z+   01:32   0:00 [pthread-test] <defunct>
-----

And of course, pid 4543 is not debug-able.  Adding a sleep and trying to
debug the thread that goes defunct do not show this behaviour:

-----
Attaching to process 4525
Using host libthread_db library "/lib/libthread_db.so.1".
Reading symbols from /root/pthread-test...done.
Reading symbols from /lib/libpthread.so.0...done.
[Thread debugging using libthread_db enabled]
[New Thread 16384 (LWP 4523)]
[New Thread 32769 (LWP 4524)]
[New Thread 16386 (LWP 4525)]
Loaded symbols for /lib/libpthread.so.0
Reading symbols from /lib/libc.so.6.1...done.
Loaded symbols for /lib/libc.so.6.1
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
0x00000200001734f4 in nanosleep () from /lib/libc.so.6.1
(gdb) s
Single stepping until exit from function nanosleep,
which has no line number information.
[Switching to Thread 16386 (LWP 4525)]
pthread_handle_sigcancel (sig=524288) at descr.h:248
248       return THREAD_SELF;
(gdb)
535       if (self == __manager_thread)
(gdb)
1069    {
(gdb)
248       return THREAD_SELF;
(gdb)
1069    {
(gdb)
248       return THREAD_SELF;
(gdb)
1069    {
(gdb)
535       if (self == __manager_thread)
(gdb)
1073      if (self == manager_thread)
(gdb)
1078      if (__builtin_expect (__pthread_exit_requested, 0)) {
(gdb)
1081        if (self == __pthread_main_thread) {
(gdb)
1088        _exit(__pthread_exit_code);
(gdb)
*__GI__exit (status=0) at _exit.c:35
35            INLINE_SYSCALL (exit, 1, status);
(gdb)
 
Program exited normally.
(gdb)
-----

Debugging the manager thread seems to just loop inside
__pthread_manager().  This issue is with both gcc-3.3.x and gcc-3.4.4, a
few versions of binutils, and glibc-2.3.[45].

NPTL works fine (and I know is the preferred threading implementation),
but currently not entirely a solution, as some of the ev6 based boxes
have issues with 2.6 kernels.

Any ideas on how to proceed in debugging this will be appreciated.


Regards,

-- 
Martin Schlemmer

Attachment: signature.asc
Description: This is a digitally signed message part


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