public inbox for gdb@sourceware.org
 help / color / mirror / Atom feed
* Native Solaris thread debugging is broken since 2006-01-24
@ 2006-05-27 17:52 Peter Schauer
  2006-06-21  7:23 ` Joel Brobecker
  0 siblings, 1 reply; 2+ messages in thread
From: Peter Schauer @ 2006-05-27 17:52 UTC (permalink / raw)
  To: gdb

This change:

2006-01-24  Daniel Jacobowitz  <dan@codesourcery.com>

        * infcmd.c: Include "observer.h".
        (post_create_inferior): New function.
        (run_command_1): Call it.  Also call proceed.
        * inferior.h (post_create_inferior): New prototype.
        * Makefile.in (infcmd.o): Update.

        * gnu-nat.c (gnu_create_inferior): Don't call proceed.
        * go32-nat.c (go32_create_inferior): Likewise.
        * nto-procfs.c (procfs_create_inferior): Likewise.
        * procfs.c (procfs_create_inferior): Likewise.

breaks native Solaris thread debugging.

Using the pthreads testsuite case, before this change you get the
following with the commands
break main
run
info threads:

  6 Thread 3          0xdfa39657 in _swtch () from /usr/lib/libthread.so.1
  5 Thread 2 (LWP 2)  0xdfadb5a8 in _signotifywait () from /usr/lib/libc.so.1
* 4 Thread 1 (LWP 1)  main (argc=0x1, argv=0x8047874)
    at /users/pes/gdbnd/devo/gdb/testsuite/gdb.threads/pthreads.c:122
  3 LWP    3          0xdfa3a158 in _lwp_start () from /usr/lib/libthread.so.1
  2 LWP    2          0xdfadb5a8 in _signotifywait () from /usr/lib/libc.so.1
  1 LWP    1          main (argc=0x1, argv=0x8047874)
    at /users/pes/gdbnd/devo/gdb/testsuite/gdb.threads/pthreads.c:122

and after the change you get only:

  3 LWP 3  0xdfa3a158 in _lwp_start () from /usr/lib/libthread.so.1
  2 LWP 2  0xdfadb5a8 in _signotifywait () from /usr/lib/libc.so.1
* 1 LWP 1  main (argc=0x1, argv=0x8047874)
    at /users/pes/gdbnd/devo/gdb/testsuite/gdb.threads/pthreads.c:12

Here is the reason for the failure:
static void
sol_thread_create_inferior (char *exec_file, char *allargs, char **env,
                            int from_tty)
{
  procfs_ops.to_create_inferior (exec_file, allargs, env, from_tty);

  if (sol_thread_active && !ptid_equal (inferior_ptid, null_ptid))
    {
      /* Save for xfer_memory.  */
      main_ph.ptid = inferior_ptid;

      push_target (&sol_thread_ops);

Before the change, procfs_ops.to_create_inferior called proceed, which took
the execution till the breakpoint at main.
This caused the shared libraries to be read in as a side effect, and
sol_thread_active was set via the sol_thread_new_objfile hook, after
libthread.so was read in.

With the removed proceed call, the shared libraries are read in much later,
sol_thread_active is not yet set in the above code, and the sol_thread_ops
target is never pushed, causing user level thread debugging to fail.

A lightly tested patch along the lines of linux-thread-db.c is included
below, it brings the testsuite results for the threads tests back to
the behaviour in gdb-6.4, but I do not have enough spare time to follow
this through on gdb-patches.

As I doubt that this can be fixed in time for gdb-6.5, I suggest that
an appropriate NEWS entry for this issue should be created,
to save Solaris users from grief after upgrading to 6.5.

--- sol-thread.c.orig	2006-05-23 18:06:45.000000000 +0200
+++ sol-thread.c	2006-05-27 13:39:00.550131000 +0200
@@ -356,18 +356,6 @@ sol_thread_attach (char *args, int from_
   /* Must get symbols from shared libraries before libthread_db can run!  */
   solib_add (NULL, from_tty, (struct target_ops *) 0, auto_solib_add);
 
-  if (sol_thread_active)
-    {
-      printf_filtered ("sol-thread active.\n");
-      main_ph.ptid = inferior_ptid; /* Save for xfer_memory.  */
-      push_target (&sol_thread_ops);
-      inferior_ptid = lwp_to_thread (inferior_ptid);
-      if (PIDGET (inferior_ptid) == -1)
-	inferior_ptid = main_ph.ptid;
-      else
-	add_thread (inferior_ptid);
-    }
-
   /* FIXME: Might want to iterate over all the threads and register
      them.  */
 }
@@ -384,6 +372,7 @@ sol_thread_detach (char *args, int from_
 {
   inferior_ptid = pid_to_ptid (PIDGET (main_ph.ptid));
   unpush_target (&sol_thread_ops);
+  sol_thread_active = 0;
   procfs_ops.to_detach (args, from_tty);
 }
 
@@ -756,21 +745,6 @@ sol_thread_create_inferior (char *exec_f
 			    int from_tty)
 {
   procfs_ops.to_create_inferior (exec_file, allargs, env, from_tty);
-
-  if (sol_thread_active && !ptid_equal (inferior_ptid, null_ptid))
-    {
-      /* Save for xfer_memory.  */
-      main_ph.ptid = inferior_ptid;
-
-      push_target (&sol_thread_ops);
-
-      inferior_ptid = lwp_to_thread (inferior_ptid);
-      if (PIDGET (inferior_ptid) == -1)
-	inferior_ptid = main_ph.ptid;
-
-      if (!in_thread_list (inferior_ptid))
-	add_thread (inferior_ptid);
-    }
 }
 
 /* This routine is called whenever a new symbol table is read in, or
@@ -822,7 +796,21 @@ sol_thread_new_objfile (struct objfile *
       goto quit;
     }
 
-  sol_thread_active = 1;
+  if (!sol_thread_active && !ptid_equal (inferior_ptid, null_ptid))
+    {
+      /* Save for xfer_memory.  */
+      main_ph.ptid = inferior_ptid;
+
+      push_target (&sol_thread_ops);
+      sol_thread_active = 1;
+
+      inferior_ptid = lwp_to_thread (inferior_ptid);
+      if (PIDGET (inferior_ptid) == -1)
+	inferior_ptid = main_ph.ptid;
+
+      if (!in_thread_list (inferior_ptid))
+	add_thread (inferior_ptid);
+    }
 
 quit:
   /* Call predecessor on chain, if any.  */
@@ -836,6 +824,7 @@ static void
 sol_thread_mourn_inferior (void)
 {
   unpush_target (&sol_thread_ops);
+  sol_thread_active = 0;
   procfs_ops.to_mourn_inferior ();
 }
 

-- 
Peter Schauer			Peter.Schauer@mytum.de

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: Native Solaris thread debugging is broken since 2006-01-24
  2006-05-27 17:52 Native Solaris thread debugging is broken since 2006-01-24 Peter Schauer
@ 2006-06-21  7:23 ` Joel Brobecker
  0 siblings, 0 replies; 2+ messages in thread
From: Joel Brobecker @ 2006-06-21  7:23 UTC (permalink / raw)
  To: Peter Schauer; +Cc: gdb

Hello all,

>         * infcmd.c: Include "observer.h".
>         (post_create_inferior): New function.
>         (run_command_1): Call it.  Also call proceed.
>         * inferior.h (post_create_inferior): New prototype.
>         * Makefile.in (infcmd.o): Update.
> 
>         * gnu-nat.c (gnu_create_inferior): Don't call proceed.
>         * go32-nat.c (go32_create_inferior): Likewise.
>         * nto-procfs.c (procfs_create_inferior): Likewise.
>         * procfs.c (procfs_create_inferior): Likewise.
> 
> breaks native Solaris thread debugging.

FYI: I have created threads/2137 to report this problem. I will use
that number to document this problem.

-- 
Joel

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2006-06-21  4:50 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-05-27 17:52 Native Solaris thread debugging is broken since 2006-01-24 Peter Schauer
2006-06-21  7:23 ` Joel Brobecker

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).