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:
parent
ab03e6d597
commit
ad93bc4a36
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=140071
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user