From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13442 invoked by alias); 25 Oct 2006 14:46:04 -0000 Received: (qmail 13432 invoked by uid 22791); 25 Oct 2006 14:46:02 -0000 X-Spam-Check-By: sourceware.org Received: from metis.extern.pengutronix.de (HELO metis.extern.pengutronix.de) (83.236.181.26) by sourceware.org (qpsmtpd/0.31) with ESMTP; Wed, 25 Oct 2006 14:45:48 +0000 Received: from rsc by metis.extern.pengutronix.de with local (Exim 3.36 #1 (Debian)) id 1Gck0X-0007A6-00; Wed, 25 Oct 2006 16:45:29 +0200 Date: Wed, 25 Oct 2006 14:46:00 -0000 From: Robert Schwebel To: Daniel Jacobowitz Cc: Benedikt Spranger , gdb@sourceware.org, Marc Kleine-Budde , Luotao Fu Subject: Re: thread-debuging with gdbserver on ARM/NPTL Message-ID: <20061025144529.GQ18636@pengutronix.de> References: <20061024202933.1d5129b9.b.spranger@linutronix.de> <20061024183404.GA16931@nevyn.them.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="wRRV7LY7NUeQGEoC" Content-Disposition: inline In-Reply-To: <20061024183404.GA16931@nevyn.them.org> User-Agent: Mutt/1.5.5.1+cvs20040105i Mailing-List: contact gdb-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-owner@sourceware.org X-SW-Source: 2006-10/txt/msg00240.txt.bz2 --wRRV7LY7NUeQGEoC Content-Type: text/plain; charset=iso-8859-15 Content-Disposition: inline Content-length: 1350 On Tue, Oct 24, 2006 at 02:34:04PM -0400, Daniel Jacobowitz wrote: > On Tue, Oct 24, 2006 at 08:29:33PM +0200, Benedikt Spranger wrote: > > Attaching gdb to gdbserver, set the above breakpoints and issue "cont", > > then the program stops at breakpoint BP1. BP2 is never reached, although > > the thread is visible via "ps" on the target system. The thread is stuck > > in sys_futex and not as expected in the ptrace breakpoint trap. Also gdb > > does not show that the thread was created. > > > > This can be reproduced with glibc 2.3.6 -> 2.5, kernel 2.6.14 -> > > 2.6.19-rc2, gcc 3.4 -> 4.1.1 and binutils up to cvs-latest. > > Well, it works just fine for me, so you may want to investigate your > setup. Have you set solib-absolute-prefix, the most frequent problem? > Check if "info shared" and "info threads" show sensible output. Here are some more details about the problem. It turned out that it works if you link against libpthread dynamically and doesn't with -static. The test program and log reports of the static and dynamic case are attached. Robert -- Dipl.-Ing. Robert Schwebel | http://www.pengutronix.de Pengutronix - Linux Solutions for Science and Industry Handelsregister: Amtsgericht Hildesheim, HRA 2686 Hannoversche Str. 2, 31134 Hildesheim, Germany Phone: +49-5121-206917-0 | Fax: +49-5121-206917-9 --wRRV7LY7NUeQGEoC Content-Type: text/x-csrc; charset=iso-8859-15 Content-Disposition: attachment; filename="gdb_test.c" Content-length: 1946 #define _XOPEN_SOURCE 600 #include #include #include #include #include #include #include #include #include #include #define die(msg) {perror (msg); exit (EXIT_FAILURE); } sem_t sem; int stop; void sig_handler (int sig) { stop = sig; } void *thread1 (void *data) { int t = (int) data; while (!stop) { while (sem_wait (&sem) == -1 && errno == EINTR) continue; printf ("My name is %d. thread %d\n", t, t); fflush (stdout); sem_post (&sem); sleep (1); } return NULL; } void *thread2 (void *data) { int t = (int) data; while (!stop) { while (sem_wait (&sem) == -1 && errno == EINTR) continue; printf ("My name is %d. thread %d\n", t, t); fflush (stdout); sem_post (&sem); sleep (1); } return NULL; } void *thread3 (void *data) { int t = (int) data; while (!stop) { while (sem_wait (&sem) == -1 && errno == EINTR) continue; printf ("My name is %d. thread %d\n", t, t); fflush (stdout); sem_post (&sem); sleep (1); } return NULL; } void *thread4 (void *data) { int t = (int) data; while (!stop) { while (sem_wait (&sem) == -1 && errno == EINTR) continue; printf ("My name is %d. thread %d\n", t, t); fflush (stdout); sem_post (&sem); sleep (1); } return NULL; } int main (void) { pthread_t p1, p2, p3, p4; signal (SIGINT, sig_handler); stop = 0; if (sem_init (&sem, 0, 0) == -1) die ("sem_init"); pthread_create (&p1, NULL, thread1, (void *) 1); pthread_create (&p2, NULL, thread2, (void *) 2); pthread_create (&p3, NULL, thread3, (void *) 3); pthread_create (&p4, NULL, thread4, (void *) 4); while (!stop) { printf ("main\n"); fflush (stdout); sem_post (&sem); sleep (2); } sem_post (&sem); pthread_join (p1, NULL); pthread_join (p2, NULL); pthread_join (p3, NULL); pthread_join (p4, NULL); return 0; } --wRRV7LY7NUeQGEoC Content-Type: text/plain; charset=iso-8859-15 Content-Disposition: attachment; filename="static_bin.gdb.log" Content-length: 1979 build-flag: -g -Wall gdb_test.c -o gdb_test -lpthread -static gdb init script (Auszug): ............ target remote 192.168.23.216:2345 continue info share continue continue continue info thread continue lfu@himalia:/ptx/work/mkl/sprecher/testcases/test_case_3 /opt/OSELAS.Toolchain-trunk/arm-ep93xx-linux-gnueabi/gcc-4.1.1-glibc-2.5/bin/arm-ep93xx-linux-gnueabi-gdb ./gdb_test GNU gdb 6.5.50.20061010 Copyright (C) 2006 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "--host=i686-host-linux-gnu --target=arm-ep93xx-linux-gnueabi"... Breakpoint 1 at 0x8294: file gdb_test.c, line 32. Breakpoint 2 at 0x8340: file gdb_test.c, line 49. Breakpoint 3 at 0x83ec: file gdb_test.c, line 66. Breakpoint 4 at 0x8498: file gdb_test.c, line 83. Breakpoint 5 at 0x8550: file gdb_test.c, line 101. Breakpoint 6 at 0x8568: file gdb_test.c, line 102. Breakpoint 7 at 0x8580: file gdb_test.c, line 103. Breakpoint 8 at 0x8598: file gdb_test.c, line 104. 0x00008110 in _start () [New thread 420] [Switching to thread 420] Breakpoint 5, main () at gdb_test.c:101 101 pthread_create (&p1, NULL, thread1, (void *) 1); No shared libraries loaded at this time. Breakpoint 6, main () at gdb_test.c:102 102 pthread_create (&p2, NULL, thread2, (void *) 2); Breakpoint 7, main () at gdb_test.c:103 103 pthread_create (&p3, NULL, thread3, (void *) 3); Breakpoint 8, main () at gdb_test.c:104 104 pthread_create (&p4, NULL, thread4, (void *) 4); * 1 thread 420 main () at gdb_test.c:104 Program terminated with signal SIGTRAP, Trace/breakpoint trap. The program no longer exists. (gdb) --wRRV7LY7NUeQGEoC Content-Type: text/plain; charset=iso-8859-15 Content-Disposition: attachment; filename="shared_bin.gdb.log" Content-length: 4143 build-flag: -g -Wall gdb_test.c -o gdb_test -lpthread gdb init script (Auszug): ............ target remote 192.168.23.216:2345 continue info share continue continue continue info thread continue continue ...............(10 x Wiederholungen) ####################################################### lfu@himalia:/ptx/work/mkl/sprecher/testcases/test_case_3 /opt/OSELAS.Toolchain-trunk/arm-ep93xx-linux-gnueabi/gcc-4.1.1-glibc-2.5/bin/arm-ep93xx-linux-gnueabi-gdb ./gdb_test GNU gdb 6.5.50.20061010 Copyright (C) 2006 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "--host=i686-host-linux-gnu --target=arm-ep93xx-linux-gnueabi"... Breakpoint 1 at 0x86f8: file gdb_test.c, line 32. Breakpoint 2 at 0x87a4: file gdb_test.c, line 49. Breakpoint 3 at 0x8850: file gdb_test.c, line 66. Breakpoint 4 at 0x88fc: file gdb_test.c, line 83. Breakpoint 5 at 0x89b4: file gdb_test.c, line 101. Breakpoint 6 at 0x89cc: file gdb_test.c, line 102. Breakpoint 7 at 0x89e4: file gdb_test.c, line 103. Breakpoint 8 at 0x89fc: file gdb_test.c, line 104. 0x400007e0 in ?? () [New thread 442] [Switching to thread 442] Breakpoint 5, main () at gdb_test.c:101 101 pthread_create (&p1, NULL, thread1, (void *) 1); >From To Syms Read Shared Object Library 0x400007e0 0x40017334 Yes /ptx/work/mkl/sprecher/OSELAS.BSP-Phytec-phyCORE-PXA270-trunk/root-debug/lib/ld-linux.so.3 0x40028ea0 0x40035a88 Yes /ptx/work/mkl/sprecher/OSELAS.BSP-Phytec-phyCORE-PXA270-trunk/root-debug/lib/libpthread.so.0 0x40055ee0 0x401326f0 Yes /ptx/work/mkl/sprecher/OSELAS.BSP-Phytec-phyCORE-PXA270-trunk/root-debug/lib/libc.so.6 Breakpoint 6, main () at gdb_test.c:102 102 pthread_create (&p2, NULL, thread2, (void *) 2); Breakpoint 7, main () at gdb_test.c:103 103 pthread_create (&p3, NULL, thread3, (void *) 3); Breakpoint 8, main () at gdb_test.c:104 104 pthread_create (&p4, NULL, thread4, (void *) 4); 4 thread 446 0x400315bc in __new_sem_wait (sem=0x10cf8) at ../nptl/sysdeps/unix/sysv/linux/sem_wait.c:48 3 thread 445 0x400315bc in __new_sem_wait (sem=0x10cf8) at ../nptl/sysdeps/unix/sysv/linux/sem_wait.c:48 2 thread 444 0x400315bc in __new_sem_wait (sem=0x10cf8) at ../nptl/sysdeps/unix/sysv/linux/sem_wait.c:48 * 1 thread 442 main () at gdb_test.c:104 [Switching to thread 444] Breakpoint 1, thread1 (data=0x1) at gdb_test.c:32 32 printf ("My name is %d. thread %d\n", t, t); ---Type to continue, or q to quit--- [Switching to thread 445] Breakpoint 2, thread2 (data=0x2) at gdb_test.c:49 49 printf ("My name is %d. thread %d\n", t, t); [Switching to thread 446] Breakpoint 3, thread3 (data=0x3) at gdb_test.c:66 66 printf ("My name is %d. thread %d\n", t, t); [Switching to thread 444] Breakpoint 1, thread1 (data=0x1) at gdb_test.c:32 32 printf ("My name is %d. thread %d\n", t, t); [New thread 447] [Switching to thread 447] Breakpoint 4, thread4 (data=0x4) at gdb_test.c:83 83 printf ("My name is %d. thread %d\n", t, t); [Switching to thread 445] Breakpoint 2, thread2 (data=0x2) at gdb_test.c:49 49 printf ("My name is %d. thread %d\n", t, t); [Switching to thread 446] Breakpoint 3, thread3 (data=0x3) at gdb_test.c:66 66 printf ("My name is %d. thread %d\n", t, t); [Switching to thread 444] Breakpoint 1, thread1 (data=0x1) at gdb_test.c:32 32 printf ("My name is %d. thread %d\n", t, t); [Switching to thread 447] Breakpoint 4, thread4 (data=0x4) at gdb_test.c:83 83 printf ("My name is %d. thread %d\n", t, t); [Switching to thread 445] Breakpoint 2, thread2 (data=0x2) at gdb_test.c:49 49 printf ("My name is %d. thread %d\n", t, t); --wRRV7LY7NUeQGEoC--