diff options
author | Joel Brobecker <brobecker@gnat.com> | 2012-08-16 23:54:50 +0000 |
---|---|---|
committer | Joel Brobecker <brobecker@gnat.com> | 2012-08-16 23:54:50 +0000 |
commit | d80ee84fe21876c78f66e60b70e335e8dab99d07 (patch) | |
tree | 65c4066de39d33c1a5465ad58ef68762a95819cc /gdb/linux-nat.c | |
parent | 2dcc608618e09c68ed83560f2471a8b2ef52db79 (diff) | |
download | gdb-d80ee84fe21876c78f66e60b70e335e8dab99d07.zip gdb-d80ee84fe21876c78f66e60b70e335e8dab99d07.tar.gz gdb-d80ee84fe21876c78f66e60b70e335e8dab99d07.tar.bz2 |
Change detach_breakpoints to take a ptid instead of a pid
Before this change, detach_breakpoints would take a pid, and then
set inferior_ptid to a ptid that it constructs using pid_to_ptid (pid).
Unfortunately, this ptid is not necessarily valid. Consider for
instance the case of ia64-hpux, where ttrace refuses a register-read
operation if the LWP is not provided.
This problems shows up when GDB is trying to handle fork events.
Assuming GDB is configured to follow the parent, GDB will try to
detach from the child. But before doing so, it needs to remove
all breakpoints inside that child. On ia64, this involves reading
inferior (the child's) memory. And on ia64-hpux, reading memory
requires us to read the bsp and bspstore registers, in order to
determine where that memory is relative to the value of those
registers, and thus to determine which ttrace operation to use in
order to fetch that memory (see ia64_hpux_xfer_memory).
This patch therefore changes detach_breakpoints to take a ptid instead
of a pid, and then updates all callers.
One of the consequences of this patch is that it trips an assert
on GNU/Linux targets. But this assert appears to have not actual
purpose, and is thus removed.
gdb/ChangeLog:
* breakpoint.h (detach_breakpoints): pid parameter is now a ptid.
* breakpoint.c (detach_breakpoints): Change pid parameter into
a ptid. Adjust code accordingly.
* infrun.c (handle_inferior_event): Delete variable child_pid.
Update call to detach_breakpoints to pass the child ptid for
fork events.
* linux-nat.c (linux_nat_iterate_watchpoint_lwps): Remove
assert that inferior_ptid's lwp is zero.
(linux_handle_extended_wait): Update call to detach_breakpoints.
* inf-ttrace.c (inf_ttrace_follow_fork): Update call to
detach_breakpoints.
Diffstat (limited to 'gdb/linux-nat.c')
-rw-r--r-- | gdb/linux-nat.c | 3 |
1 files changed, 1 insertions, 2 deletions
diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index 9844b0c..3516565 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -1307,7 +1307,6 @@ linux_nat_iterate_watchpoint_lwps pid_t child_pid = GET_PID (inferior_ptid); ptid_t child_ptid = ptid_build (child_pid, child_pid, 0); - gdb_assert (!is_lwp (inferior_ptid)); gdb_assert (find_lwp_pid (child_ptid) == NULL); child_lp = add_lwp (child_ptid); child_lp->stopped = 1; @@ -2314,7 +2313,7 @@ linux_handle_extended_wait (struct lwp_info *lp, int status, /* This won't actually modify the breakpoint list, but will physically remove the breakpoints from the child. */ - detach_breakpoints (new_pid); + detach_breakpoints (ptid_build (new_pid, new_pid, 0)); /* Retain child fork in ptrace (stopped) state. */ if (!find_fork_pid (new_pid)) |