This is the mail archive of the gdb@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]