* linux-nat.c (linux_child_follow_fork): Copy attach_flag from the

parent to the child.
	* inf-ttrace.c (inf_ttrace_follow_fork): Likewise.
	* inf-ptrace.c (inf_ptrace_follow_fork): Likewise.  Use
	remove_breakpoints to remove breakpoints from the parent.
This commit is contained in:
Pedro Alves 2009-01-26 22:34:55 +00:00
parent 7488432fc2
commit 77435e4c95
4 changed files with 27 additions and 6 deletions

View file

@ -1,3 +1,11 @@
2009-01-26 Pedro Alves <pedro@codesourcery.com>
* linux-nat.c (linux_child_follow_fork): Copy attach_flag from the
parent to the child.
* inf-ttrace.c (inf_ttrace_follow_fork): Likewise.
* inf-ptrace.c (inf_ptrace_follow_fork): Likewise. Use
remove_breakpoints to remove breakpoints from the parent.
2009-01-26 Pedro Alves <pedro@codesourcery.com> 2009-01-26 Pedro Alves <pedro@codesourcery.com>
PR backtrace/9458, PR backtrace/8864: PR backtrace/9458, PR backtrace/8864:

View file

@ -73,7 +73,8 @@ inf_ptrace_follow_fork (struct target_ops *ops, int follow_child)
CORE_ADDR step_range_start = last_tp->step_range_start; CORE_ADDR step_range_start = last_tp->step_range_start;
CORE_ADDR step_range_end = last_tp->step_range_end; CORE_ADDR step_range_end = last_tp->step_range_end;
struct frame_id step_frame_id = last_tp->step_frame_id; struct frame_id step_frame_id = last_tp->step_frame_id;
int attach_flag = find_inferior_pid (pid)->attach_flag;
struct inferior *inf;
struct thread_info *tp; struct thread_info *tp;
/* Otherwise, deleting the parent would get rid of this /* Otherwise, deleting the parent would get rid of this
@ -82,7 +83,7 @@ inf_ptrace_follow_fork (struct target_ops *ops, int follow_child)
/* Before detaching from the parent, remove all breakpoints from /* Before detaching from the parent, remove all breakpoints from
it. */ it. */
detach_breakpoints (pid); remove_breakpoints ();
if (ptrace (PT_DETACH, pid, (PTRACE_TYPE_ARG3)1, 0) == -1) if (ptrace (PT_DETACH, pid, (PTRACE_TYPE_ARG3)1, 0) == -1)
perror_with_name (("ptrace")); perror_with_name (("ptrace"));
@ -94,7 +95,8 @@ inf_ptrace_follow_fork (struct target_ops *ops, int follow_child)
detach_inferior (pid); detach_inferior (pid);
/* Add the child. */ /* Add the child. */
add_inferior (fpid); inf = add_inferior (fpid);
inf->attach_flag = attach_flag;
tp = add_thread_silent (inferior_ptid); tp = add_thread_silent (inferior_ptid);
tp->step_resume_breakpoint = step_resume_breakpoint; tp->step_resume_breakpoint = step_resume_breakpoint;

View file

@ -458,6 +458,8 @@ inf_ttrace_follow_fork (struct target_ops *ops, int follow_child)
if (follow_child) if (follow_child)
{ {
struct inferior *inf;
/* Copy user stepping state to the new inferior thread. */ /* Copy user stepping state to the new inferior thread. */
step_resume_breakpoint = last_tp->step_resume_breakpoint; step_resume_breakpoint = last_tp->step_resume_breakpoint;
step_range_start = last_tp->step_range_start; step_range_start = last_tp->step_range_start;
@ -469,7 +471,8 @@ inf_ttrace_follow_fork (struct target_ops *ops, int follow_child)
last_tp->step_resume_breakpoint = NULL; last_tp->step_resume_breakpoint = NULL;
inferior_ptid = ptid_build (fpid, flwpid, 0); inferior_ptid = ptid_build (fpid, flwpid, 0);
add_inferior (fpid); inf = add_inferior (fpid);
inf->attach_flag = find_inferior_pid (pid)->attach_flag;
detach_breakpoints (pid); detach_breakpoints (pid);
target_terminal_ours (); target_terminal_ours ();

View file

@ -730,9 +730,13 @@ linux_child_follow_fork (struct target_ops *ops, int follow_child)
else else
{ {
struct fork_info *fp; struct fork_info *fp;
struct inferior *parent_inf, *child_inf;
/* Add process to GDB's tables. */ /* Add process to GDB's tables. */
add_inferior (child_pid); child_inf = add_inferior (child_pid);
parent_inf = find_inferior_pid (GET_PID (last_ptid));
child_inf->attach_flag = parent_inf->attach_flag;
/* Retain child fork in ptrace (stopped) state. */ /* Retain child fork in ptrace (stopped) state. */
fp = find_fork_pid (child_pid); fp = find_fork_pid (child_pid);
@ -800,6 +804,7 @@ linux_child_follow_fork (struct target_ops *ops, int follow_child)
struct thread_info *last_tp = find_thread_pid (last_ptid); struct thread_info *last_tp = find_thread_pid (last_ptid);
struct thread_info *tp; struct thread_info *tp;
char child_pid_spelling[40]; char child_pid_spelling[40];
struct inferior *parent_inf, *child_inf;
/* Copy user stepping state to the new inferior thread. */ /* Copy user stepping state to the new inferior thread. */
struct breakpoint *step_resume_breakpoint = last_tp->step_resume_breakpoint; struct breakpoint *step_resume_breakpoint = last_tp->step_resume_breakpoint;
@ -829,7 +834,10 @@ linux_child_follow_fork (struct target_ops *ops, int follow_child)
/* Add the new inferior first, so that the target_detach below /* Add the new inferior first, so that the target_detach below
doesn't unpush the target. */ doesn't unpush the target. */
add_inferior (child_pid); child_inf = add_inferior (child_pid);
parent_inf = find_inferior_pid (GET_PID (last_ptid));
child_inf->attach_flag = parent_inf->attach_flag;
/* If we're vforking, we may want to hold on to the parent until /* If we're vforking, we may want to hold on to the parent until
the child exits or execs. At exec time we can remove the old the child exits or execs. At exec time we can remove the old