* 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:
parent
7488432fc2
commit
77435e4c95
4 changed files with 27 additions and 6 deletions
|
@ -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:
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 ();
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue