« Return to Thread: Internal error on ia64-hpux when inferior calls fork...

Re: [RFA/commit 1/3] Do not call detach_breakpoints in inf_ttrace_follow_fork.

by Pedro Alves-7 :: Rate this Message:

| View in Thread

On 06/14/2012 07:29 PM, Joel Brobecker wrote:

> These calls are unnecessary because handle_inferior_events already
> called detach_breakpoints for us before calling the target_ops'
> to_follow_fork hook.


Only in the fork case, and only from the child.  vfork is more
complicated.  See linux-nat.c:linux_child_follow_fork:

  if (! follow_child)
    {
      struct lwp_info *child_lp = NULL;

      /* We're already attached to the parent, by default.  */

      /* Detach new forked process?  */
      if (detach_fork)
        {
          struct cleanup *old_chain;

          /* Before detaching from the child, remove all breakpoints
             from it.  If we forked, then this has already been taken
             care of by infrun.c.  If we vforked however, any
             breakpoint inserted in the parent is visible in the
             child, even those added while stopped in a vfork
             catchpoint.  This will remove the breakpoints from the
             parent also, but they'll be reinserted below.  */
          if (has_vforked)
            {
              /* keep breakpoints list in sync.  */
              remove_breakpoints_pid (GET_PID (inferior_ptid));
            }


> Without this change, we would get a warning

> when trying to remove the breakpoint the second time, because
> the ia64 code detects that the breakpoint address does not point
> to a breakpoint instruction (any more):
>
>     warning: Cannot remove breakpoint at address 0x4000000000000d52, no break instruction at such address.
>
> gdb/ChangeLog:
>
>         * inf-ttrace.c (inf_ttrace_follow_fork): Remove calls to
>         detach_breakpoints.
>
> I am sufficiently confident in this patch that I think I can commit
> on my own, but a second pair of eyes wouldn't hurt...
>
> ---
>  gdb/inf-ttrace.c |    2 --
>  1 files changed, 0 insertions(+), 2 deletions(-)
>
> diff --git a/gdb/inf-ttrace.c b/gdb/inf-ttrace.c
> index 2c620d5..ffe56e1 100644
> --- a/gdb/inf-ttrace.c
> +++ b/gdb/inf-ttrace.c
> @@ -457,7 +457,6 @@ inf_ttrace_follow_fork (struct target_ops *ops, int follow_child)
>        inf->pspace = parent_inf->pspace;
>        inf->aspace = parent_inf->aspace;
>        copy_terminal_info (inf, parent_inf);
> -      detach_breakpoints (pid);


This branch is detaching breakpoints from the parent, not the child.

>  
>        target_terminal_ours ();
>        fprintf_unfiltered (gdb_stdlog,
> @@ -467,7 +466,6 @@ inf_ttrace_follow_fork (struct target_ops *ops, int follow_child)
>    else
>      {
>        inferior_ptid = ptid_build (pid, lwpid, 0);
> -      detach_breakpoints (fpid);
>  
>        target_terminal_ours ();
>        fprintf_unfiltered (gdb_stdlog,


--
Pedro Alves

 « Return to Thread: Internal error on ia64-hpux when inferior calls fork...