This is the mail archive of the
gdb@sources.redhat.com
mailing list for the GDB project.
breakpoints and pthreads
- From: Nick NoSpam <nicknospam at optonline dot net>
- To: gdb at sources dot redhat dot com
- Date: Wed, 19 May 2004 21:33:06 -0400
- Subject: breakpoints and pthreads
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