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
This commit is contained in:
Peter Edwards 2005-01-11 14:53:16 +00:00
parent ab03e6d597
commit ad93bc4a36
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=140071

View File

@ -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);