From ad93bc4a369f5d4b4283ab437a71ddcc6d5484cb Mon Sep 17 00:00:00 2001 From: Peter Edwards Date: Tue, 11 Jan 2005 14:53:16 +0000 Subject: [PATCH] When grabbing registers for an lwp, fake the inferior's pid using the lwp ID before invoking the underlying target operation. For corefiles, we rely on gdb internals to do this, and it uses the pid as an index, rather than the lwpid, so previously, backtraces for multithreaded core files wasn't working correctly. For processes, we currently use ptrace directly, so fixup that code to also use the pid directly. Discussed With: marcel, davidxu MFC After: 4 days --- gnu/usr.bin/gdb/libgdb/fbsd-threads.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/gnu/usr.bin/gdb/libgdb/fbsd-threads.c b/gnu/usr.bin/gdb/libgdb/fbsd-threads.c index 02b250fd817..64e8db77d62 100644 --- a/gnu/usr.bin/gdb/libgdb/fbsd-threads.c +++ b/gnu/usr.bin/gdb/libgdb/fbsd-threads.c @@ -602,7 +602,8 @@ fbsd_lwp_fetch_registers (int regno) return; } - lwp = GET_LWP (inferior_ptid); + /* XXX: We've replaced the pid with the lwpid for GDB's benefit. */ + lwp = GET_PID (inferior_ptid); if (ptrace (PT_GETREGS, lwp, (caddr_t) &gregs, 0) == -1) error ("Cannot get lwp %d registers: %s\n", lwp, safe_strerror (errno)); @@ -1271,7 +1272,10 @@ ps_lgetregs (struct ps_prochandle *ph, lwpid_t lwpid, prgregset_t gregset) struct cleanup *old_chain; old_chain = save_inferior_ptid (); - inferior_ptid = BUILD_LWP (lwpid, PIDGET (inferior_ptid)); + + /* XXX: Target operation isn't lwp aware: replace pid with lwp */ + inferior_ptid = BUILD_LWP (0, lwpid); + target_fetch_registers (-1); fill_gregset (gregset, -1); do_cleanups (old_chain);