This is the mail archive of the
gdb@sources.redhat.com
mailing list for the GDB project.
Re: breakpoints and pthreads
- From: Nick NoSpam <nicknospam at optonline dot net>
- To: gdb at sources dot redhat dot com
- Date: Mon, 24 May 2004 04:28:07 -0400
- Subject: Re: breakpoints and pthreads
- References: <1085016786.25625.825.camel@nimble.325Bayport>
Any ideas on this issue? Should I file a bug?
I fiddled w/ this a little more and found that setting a breakpoint in
the thread callback ('wait_thread' in the example below) causes
problems.
This is the output I get when the thread gets created:
Program received signal SIG32, Real-time event 32.
Cannot remove breakpoints because program is no longer writable.
It might be running in another process.
Further execution is probably impossible.
0x4002ba34 in pthread_getconcurrency () from /lib/libpthread.so.0
Regards,
Nick
On Wed, 2004-05-19 at 21:33, Nick NoSpam wrote:
> Hi,
>
> I started using gdb a few months ago on RedHat (originally installed as
> version 7.2). While doing so, my little test program--which spawns a
> thread--would stop execution in all threads (the main process and the
> spawned thread) when a breakpoint was hit. I read the documentation and
> this is appropriate behavior:
> Section 5.4 Stopping and starting multi-threaded programs
> ...
> Whenever your program stops under GDB for any reason, *all* threads
> of execution stop, not just the current thread.
>
> I recently switched to Gentoo which uses newer versions of practically
> all libraries than my RH 7.2. When I compile and run the same program
> now, the spawned thread does not stop when a breakpoint is hit.
>
> Here is the simple program:
> #include <stdio.h>
> #include <pthread.h>
> #include <unistd.h>
>
> static void *wait_thread(void *arg);
>
> int main(int argc, char *argv[])
> {
> printf("[ main ] Program enter.\n");
>
> pthread_t t;
> int res = pthread_create(&t, NULL, wait_thread, NULL);
> if(res != 0)
> {
> printf("[ main ] Error creating wait thread!\n");
> }
>
> printf("[ main ] Going to sleep...\n");
> sleep(3);
> printf("[ main ] Exitting...\n");
>
> return(0);
> }
>
> static void *wait_thread(void *arg)
> {
> while(1)
> {
> printf("[ wait_thread ] Waiting in thread\n");
> sleep(1);
> }
> }
>
>
> Compiled with:
> gcc -g threadtest.c -o threadtest -lpthread
>
> Here is a snippet of the debug session:
> nick@nimble gdbtest $ gdb threadtest
> GNU gdb 6.1
> Copyright 2004 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 "i686-pc-linux-gnu"...Using host
> libthread_db library "/lib/libthread_db.so.1".
>
> (gdb) break main
> Breakpoint 1 at 0x8048444: file threadtest.c, line 9.
> (gdb) break 18
> Breakpoint 2 at 0x8048488: file threadtest.c, line 18.
> (gdb) run
> Starting program: /home/nick/gdbtest/threadtest
>
> Breakpoint 1, main (argc=1, argv=0xbffff6c4) at threadtest.c:9
> 9 printf("[ main ] Program enter.\n");
> (gdb) n
> [ main ] Program enter.
> 12 int res = pthread_create(&t, NULL, wait_thread, NULL);
> (gdb) n
> [ wait_thread ] Waiting in thread
>
> Program received signal SIG32, Real-time event 32.
> 0x4002ba34 in pthread_getconcurrency () from /lib/libpthread.so.0
> (gdb) [ wait_thread ] Waiting in thread
> [ wait_thread ] Waiting in thread
> [ wait_thread ] Waiting in thread
> [ wait_thread ] Waiting in thread
> [ wait_thread ] Waiting in thread
> [ wait_thread ] Waiting in thread
> [ wait_thread ] Waiting in thread
>
>
> The thread's output "[ wait_thread ] Waiting in thread" continues to
> print despite the debugger stopped (in main).
>
>
> Version Info:
> gdb: 6.1 (configured as "i686-pc-linux-gnu")
> gcc: 3.3.2 (Thread model: posix, configured with --enable-threads=posix)
> glibc: 2.3.2
> kernel: 2.6.5 (vanilla)
>
>
> Regards,
> Nick
>
>