From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17072 invoked by alias); 24 Feb 2009 17:16:08 -0000 Received: (qmail 17062 invoked by uid 22791); 24 Feb 2009 17:16:07 -0000 X-SWARE-Spam-Status: No, hits=-2.4 required=5.0 tests=AWL,BAYES_00,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (65.74.133.4) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 24 Feb 2009 17:16:00 +0000 Received: (qmail 3823 invoked from network); 24 Feb 2009 17:15:58 -0000 Received: from unknown (HELO orlando) (pedro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 24 Feb 2009 17:15:58 -0000 From: Pedro Alves To: gdb-patches@sourceware.org Subject: Re: [RFC][Patch] Fix gdb failure to access tls data for parent thread Date: Tue, 24 Feb 2009 18:58:00 -0000 User-Agent: KMail/1.9.10 Cc: Daniel Jacobowitz , Vinay Sridhar , luisgpm@linux.vnet.ibm.com References: <20090211155300.GA22689@caradoc.them.org> <20090224153153.GA7032@caradoc.them.org> <200902241558.31703.pedro@codesourcery.com> In-Reply-To: <200902241558.31703.pedro@codesourcery.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200902241716.09368.pedro@codesourcery.com> X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2009-02/txt/msg00469.txt.bz2 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 * 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, ¬ify); @@ -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. */