This is the mail archive of the gdb-patches@sourceware.org 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]

Re: [RFC][Patch] Fix gdb failure to access tls data for parent thread


On Tuesday 24 February 2009 15:58:31, Pedro Alves wrote:
> On Tuesday 24 February 2009 15:31:53, Daniel Jacobowitz wrote:
> > 81            /* Verify that this thread's pid field matches the child PID.
> > 82               If its pid field is negative, it's about to do a fork or it
> > 83               is the sole thread in a fork child.  */
> 
> Boo, I'm on glibc 2.7, which doesn't have this check, but I see it
> in glibc-2.9 sources...
> 
> > It's checking that the PID (not TID) matches proc_handle.pid.  We need
> > to find another way to read from a stopped thread, since if we put any
> > other PID there, we get no threads.  I would suggest expanding
> > ps_prochandle to include a memory thread as ptid_t.  
> 
> Right, I'll take this.

Here it is, how does it look?  This works on glibc-2.7, but then again, that
version isn't affected by this.  Could one of you please give it a shot and
see if it fixes the reported issue?

-- 
Pedro Alves

2009-02-24  Pedro Alves  <pedro@codesourcery.com>

	* gdb_proc_service.h (struct ps_prochandle): Replace pid_t field
	with a ptid_t field.
	* linux-thread-db.c (thread_get_info_callback): Build the ptid
	using the pid stored in proc_handle.ptid.
	
	(thread_from_lwp, thread_db_attach_lwp, enable_thread_event)
	(check_for_thread_db, thread_db_detach, check_event)
	(thread_db_mourn_inferior, find_new_threads_callback)
	(thread_db_find_new_threads_1): Adjust.

	* proc-service.c (ps_xfer_memory, ps_lgetregs, ps_lsetregs)
	(ps_lgetfpregs, ps_lsetfpregs, ps_getpid): Adjust.

---
 gdb/gdb_proc_service.h |    4 ++--
 gdb/linux-thread-db.c  |   20 ++++++++++----------
 gdb/proc-service.c     |   12 ++++++------
 3 files changed, 18 insertions(+), 18 deletions(-)

Index: src/gdb/gdb_proc_service.h
===================================================================
--- src.orig/gdb/gdb_proc_service.h	2009-02-24 16:15:32.000000000 +0000
+++ src/gdb/gdb_proc_service.h	2009-02-24 16:51:55.000000000 +0000
@@ -75,8 +75,8 @@ typedef prfpregset_t gdb_prfpregset_t;
 /* Structure that identifies the target process.  */
 struct ps_prochandle
 {
-  /* The process id is all we need.  */
-  pid_t pid;
+  /* The LWP we use for memory reads.  */
+  ptid_t ptid;
 };
 
 #endif /* gdb_proc_service.h */
Index: src/gdb/linux-thread-db.c
===================================================================
--- src.orig/gdb/linux-thread-db.c	2009-02-24 16:18:53.000000000 +0000
+++ src/gdb/linux-thread-db.c	2009-02-24 16:33:51.000000000 +0000
@@ -265,7 +265,7 @@ thread_get_info_callback (const td_thrha
 	   thread_db_err_str (err));
 
   /* Fill the cache.  */
-  thread_ptid = ptid_build (GET_PID (inferior_ptid), ti.ti_lid, 0);
+  thread_ptid = ptid_build (GET_PID (proc_handle.ptid), ti.ti_lid, 0);
   thread_info = find_thread_pid (thread_ptid);
 
   /* In the case of a zombie thread, don't continue.  We don't want to
@@ -309,7 +309,7 @@ thread_from_lwp (ptid_t ptid)
   gdb_assert (GET_LWP (ptid) != 0);
 
   /* Access an lwp we know is stopped.  */
-  proc_handle.pid = GET_LWP (ptid);
+  proc_handle.ptid = ptid;
   err = td_ta_map_lwp2thr_p (thread_agent, GET_LWP (ptid), &th);
   if (err != TD_OK)
     error (_("Cannot find user-level thread for LWP %ld: %s"),
@@ -352,7 +352,7 @@ thread_db_attach_lwp (ptid_t ptid)
   gdb_assert (GET_LWP (ptid) != 0);
 
   /* Access an lwp we know is stopped.  */
-  proc_handle.pid = GET_LWP (ptid);
+  proc_handle.ptid = ptid;
 
   /* If we have only looked at the first thread before libpthread was
      initialized, we may not know its thread ID yet.  Make sure we do
@@ -457,7 +457,7 @@ enable_thread_event (td_thragent_t *thre
   td_err_e err;
 
   /* Access an lwp we know is stopped.  */
-  proc_handle.pid = GET_LWP (inferior_ptid);
+  proc_handle.ptid = inferior_ptid;
 
   /* Get the breakpoint address for thread EVENT.  */
   err = td_ta_event_addr_p (thread_agent, event, &notify);
@@ -637,7 +637,7 @@ check_for_thread_db (void)
     return;
 
   /* Initialize the structure that identifies the child process.  */
-  proc_handle.pid = GET_PID (inferior_ptid);
+  proc_handle.ptid = inferior_ptid;
 
   /* Now attempt to open a connection to the thread library.  */
   err = td_ta_new_p (&proc_handle, &thread_agent);
@@ -779,7 +779,7 @@ thread_db_detach (struct target_ops *ops
 
   /* Forget about the child's process ID.  We shouldn't need it
      anymore.  */
-  proc_handle.pid = 0;
+  proc_handle.ptid = null_ptid;
 
   /* Detach thread_db target ops.  */
   unpush_target (&thread_db_ops);
@@ -810,7 +810,7 @@ check_event (ptid_t ptid)
     return;
 
   /* Access an lwp we know is stopped.  */
-  proc_handle.pid = GET_LWP (ptid);
+  proc_handle.ptid = ptid;
 
   /* If we have only looked at the first thread before libpthread was
      initialized, we may not know its thread ID yet.  Make sure we do
@@ -934,7 +934,7 @@ thread_db_mourn_inferior (struct target_
 
   /* Forget about the child's process ID.  We shouldn't need it
      anymore.  */
-  proc_handle.pid = 0;
+  proc_handle.ptid = null_ptid;
 
   target_beneath->to_mourn_inferior (target_beneath);
 
@@ -963,7 +963,7 @@ find_new_threads_callback (const td_thrh
   if (ti.ti_state == TD_THR_UNKNOWN || ti.ti_state == TD_THR_ZOMBIE)
     return 0;			/* A zombie -- ignore.  */
 
-  ptid = ptid_build (GET_PID (inferior_ptid), ti.ti_lid, 0);
+  ptid = ptid_build (GET_PID (proc_handle.ptid), ti.ti_lid, 0);
 
   if (ti.ti_tid == 0)
     {
@@ -1008,7 +1008,7 @@ thread_db_find_new_threads_1 (void)
     return;
 
   /* Access an lwp we know is stopped.  */
-  proc_handle.pid = GET_LWP (ptid);
+  proc_handle.ptid = ptid;
   /* Iterate over all user-space threads to discover new threads.  */
   err = td_ta_thr_iter_p (thread_agent, find_new_threads_callback, NULL,
 			  TD_THR_ANY_STATE, TD_THR_LOWEST_PRIORITY,
Index: src/gdb/proc-service.c
===================================================================
--- src.orig/gdb/proc-service.c	2009-02-24 16:15:38.000000000 +0000
+++ src/gdb/proc-service.c	2009-02-24 16:33:04.000000000 +0000
@@ -97,7 +97,7 @@ ps_xfer_memory (const struct ps_prochand
   int ret;
   CORE_ADDR core_addr = ps_addr_to_core_addr (addr);
 
-  inferior_ptid = pid_to_ptid (ph->pid);
+  inferior_ptid = ph->ptid;
 
   if (write)
     ret = target_write_memory (core_addr, buf, len);
@@ -257,7 +257,7 @@ ps_lgetregs (gdb_ps_prochandle_t ph, lwp
   struct cleanup *old_chain = save_inferior_ptid ();
   struct regcache *regcache;
 
-  inferior_ptid = BUILD_LWP (lwpid, ph->pid);
+  inferior_ptid = BUILD_LWP (lwpid, ptid_get_pid (ph->ptid));
   regcache = get_thread_regcache (inferior_ptid);
 
   target_fetch_registers (regcache, -1);
@@ -276,7 +276,7 @@ ps_lsetregs (gdb_ps_prochandle_t ph, lwp
   struct cleanup *old_chain = save_inferior_ptid ();
   struct regcache *regcache;
 
-  inferior_ptid = BUILD_LWP (lwpid, ph->pid);
+  inferior_ptid = BUILD_LWP (lwpid, ptid_get_pid (ph->ptid));
   regcache = get_thread_regcache (inferior_ptid);
 
   supply_gregset (regcache, (const gdb_gregset_t *) gregset);
@@ -296,7 +296,7 @@ ps_lgetfpregs (gdb_ps_prochandle_t ph, l
   struct cleanup *old_chain = save_inferior_ptid ();
   struct regcache *regcache;
 
-  inferior_ptid = BUILD_LWP (lwpid, ph->pid);
+  inferior_ptid = BUILD_LWP (lwpid, ptid_get_pid (ph->ptid));
   regcache = get_thread_regcache (inferior_ptid);
 
   target_fetch_registers (regcache, -1);
@@ -316,7 +316,7 @@ ps_lsetfpregs (gdb_ps_prochandle_t ph, l
   struct cleanup *old_chain = save_inferior_ptid ();
   struct regcache *regcache;
 
-  inferior_ptid = BUILD_LWP (lwpid, ph->pid);
+  inferior_ptid = BUILD_LWP (lwpid, ptid_get_pid (ph->ptid));
   regcache = get_thread_regcache (inferior_ptid);
 
   supply_fpregset (regcache, (const gdb_fpregset_t *) fpregset);
@@ -332,7 +332,7 @@ ps_lsetfpregs (gdb_ps_prochandle_t ph, l
 pid_t
 ps_getpid (gdb_ps_prochandle_t ph)
 {
-  return ph->pid;
+  return ptid_get_pid (ph->ptid);
 }
 
 /* Provide a prototype to silence -Wmissing-prototypes.  */


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