google-code-prettify

2010-01-02

pthreadのbacktraceでの不思議な現象

Debian lennyのgdbでbacktraceが正しく表示されないことがある。

うーむ。さっぱり原因が分からない。
どなたか分かる方、教えてください。

以下、再現させるためのプログラム。
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>


static void *print_thread(void *arg)
{
for (;;) {
printf("print thread\n");
}
}

int main(void)
{
pthread_t th;

pthread_create(&th, 0, print_thread, 0);


for (;;) {
printf("main\n");
}

return 0;
}

このプログラムをgdbで実行すると、"main\n"と"print thread\n"が表示される.
途中でCtrl-Cでプログラムを停止させてbacktraceを表示すると、stackが正しく表示されない。
(gdb) thr 1
[Switching to thread 1 (Thread 0xb7e576b0 (LWP 12994))]#0 0xb7fdc424 in __kernel_vsyscall ()
(gdb) bt
#0 0xb7fdc424 in __kernel_vsyscall ()
#1 0xb7f46b53 in ?? () from /lib/i686/cmov/libc.so.6
#2 0xb7eb87b3 in ?? () from /lib/i686/cmov/libc.so.6
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb) thr 2
[Switching to thread 2 (Thread 0xb7e56b90 (LWP 12997))]#0 0xb7fdc424 in __kernel_vsyscall ()
(gdb) bt
#0 0xb7fdc424 in __kernel_vsyscall ()
#1 0xb7f2828b in write () from /lib/i686/cmov/libc.so.6
#2 0xb7ec1d6c in _IO_file_write () from /lib/i686/cmov/libc.so.6
#3 0xb7ec2ee7 in _IO_do_write () from /lib/i686/cmov/libc.so.6
#4 0xb7ec2895 in _IO_file_overflow () from /lib/i686/cmov/libc.so.6
#5 0xb7ec5713 in __overflow () from /lib/i686/cmov/libc.so.6
#6 0xb7eb8746 in puts () from /lib/i686/cmov/libc.so.6
#7 0x08048456 in print_thread (arg=0x0) at a.c:12
#8 0xb7fb94c0 in start_thread () from /lib/i686/cmov/libpthread.so.0
#9 0xb7f386de in clone () from /lib/i686/cmov/libc.so.6

thread 1のbacktraceが、corruptと表示される。

0 件のコメント: