Mirror of the gdb mailing list
 help / color / mirror / Atom feed
From: Robert Schwebel <r.schwebel@pengutronix.de>
To: Daniel Jacobowitz <drow@false.org>
Cc: Benedikt Spranger <b.spranger@linutronix.de>,
	gdb@sourceware.org, 	Marc Kleine-Budde <mkl@pengutronix.de>,
	 	Luotao Fu <lfu@pengutronix.de>
Subject: Re: thread-debuging with gdbserver on ARM/NPTL
Date: Wed, 25 Oct 2006 14:46:00 -0000	[thread overview]
Message-ID: <20061025144529.GQ18636@pengutronix.de> (raw)
In-Reply-To: <20061024183404.GA16931@nevyn.them.org>

[-- Attachment #1: Type: text/plain, Size: 1350 bytes --]

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


[-- Attachment #2: gdb_test.c --]
[-- Type: text/x-csrc, Size: 1946 bytes --]

#define _XOPEN_SOURCE 600

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <time.h>
#include <assert.h>
#include <errno.h>
#include <signal.h>
#include <pthread.h>
#include <signal.h>

#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;
}


[-- Attachment #3: static_bin.gdb.log --]
[-- Type: text/plain, Size: 1979 bytes --]

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)                                                                                

[-- Attachment #4: shared_bin.gdb.log --]
[-- Type: text/plain, Size: 4142 bytes --]

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 <return> to continue, or q <return> 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);


  reply	other threads:[~2006-10-25 14:46 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-10-24 18:29 Benedikt Spranger
2006-10-24 18:34 ` Daniel Jacobowitz
2006-10-25 14:46   ` Robert Schwebel [this message]
2006-10-25 15:03     ` Daniel Jacobowitz
2006-10-26  9:55       ` Luotao Fu
2006-10-26 12:22         ` Daniel Jacobowitz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20061025144529.GQ18636@pengutronix.de \
    --to=r.schwebel@pengutronix.de \
    --cc=b.spranger@linutronix.de \
    --cc=drow@false.org \
    --cc=gdb@sourceware.org \
    --cc=lfu@pengutronix.de \
    --cc=mkl@pengutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox