follow-fork: don't lose the ptids as set by the target
This Linuxism has made its way into infrun.c, in the follow-fork code: inferior_ptid = ptid_build (child_pid, child_pid, 0); The OS-specific code should fill in the LWPID, TID parts with the appropriate values, if any, and the core code should not be peeking at the components of the ptids. gdb/ 2015-03-04 Pedro Alves <palves@redhat.com> * infrun.c (follow_fork_inferior): Use the whole of the inferior_ptid and pending_follow.related_pid ptids instead of building ptids from the process components. Adjust verbose output to use target_pid_to_str. * linux-nat.c (linux_child_follow_fork): Use the whole of the inferior_ptid and pending_follow.related_pid ptids instead of building ptids from the process components.
This commit is contained in:
parent
d57be0f442
commit
79639e1132
3 changed files with 31 additions and 27 deletions
|
@ -1,3 +1,13 @@
|
||||||
|
2015-03-04 Pedro Alves <palves@redhat.com>
|
||||||
|
|
||||||
|
* infrun.c (follow_fork_inferior): Use the whole of the
|
||||||
|
inferior_ptid and pending_follow.related_pid ptids instead of
|
||||||
|
building ptids from the process components. Adjust verbose output
|
||||||
|
to use target_pid_to_str.
|
||||||
|
* linux-nat.c (linux_child_follow_fork): Use the whole of the
|
||||||
|
inferior_ptid and pending_follow.related_pid ptids instead of
|
||||||
|
building ptids from the process components.
|
||||||
|
|
||||||
2015-03-04 Mark Kettenis <kettenis@gnu.org>
|
2015-03-04 Mark Kettenis <kettenis@gnu.org>
|
||||||
|
|
||||||
* inf-ptrace.c [PT_GET_PROCESS_STATE]
|
* inf-ptrace.c [PT_GET_PROCESS_STATE]
|
||||||
|
|
33
gdb/infrun.c
33
gdb/infrun.c
|
@ -408,15 +408,12 @@ static int
|
||||||
follow_fork_inferior (int follow_child, int detach_fork)
|
follow_fork_inferior (int follow_child, int detach_fork)
|
||||||
{
|
{
|
||||||
int has_vforked;
|
int has_vforked;
|
||||||
int parent_pid, child_pid;
|
ptid_t parent_ptid, child_ptid;
|
||||||
|
|
||||||
has_vforked = (inferior_thread ()->pending_follow.kind
|
has_vforked = (inferior_thread ()->pending_follow.kind
|
||||||
== TARGET_WAITKIND_VFORKED);
|
== TARGET_WAITKIND_VFORKED);
|
||||||
parent_pid = ptid_get_lwp (inferior_ptid);
|
parent_ptid = inferior_ptid;
|
||||||
if (parent_pid == 0)
|
child_ptid = inferior_thread ()->pending_follow.value.related_pid;
|
||||||
parent_pid = ptid_get_pid (inferior_ptid);
|
|
||||||
child_pid
|
|
||||||
= ptid_get_pid (inferior_thread ()->pending_follow.value.related_pid);
|
|
||||||
|
|
||||||
if (has_vforked
|
if (has_vforked
|
||||||
&& !non_stop /* Non-stop always resumes both branches. */
|
&& !non_stop /* Non-stop always resumes both branches. */
|
||||||
|
@ -460,10 +457,9 @@ holding the child stopped. Try \"set detach-on-fork\" or \
|
||||||
{
|
{
|
||||||
target_terminal_ours_for_output ();
|
target_terminal_ours_for_output ();
|
||||||
fprintf_filtered (gdb_stdlog,
|
fprintf_filtered (gdb_stdlog,
|
||||||
_("Detaching after %s from "
|
_("Detaching after %s from child %s.\n"),
|
||||||
"child process %d.\n"),
|
|
||||||
has_vforked ? "vfork" : "fork",
|
has_vforked ? "vfork" : "fork",
|
||||||
child_pid);
|
target_pid_to_str (child_ptid));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -472,7 +468,7 @@ holding the child stopped. Try \"set detach-on-fork\" or \
|
||||||
struct cleanup *old_chain;
|
struct cleanup *old_chain;
|
||||||
|
|
||||||
/* Add process to GDB's tables. */
|
/* Add process to GDB's tables. */
|
||||||
child_inf = add_inferior (child_pid);
|
child_inf = add_inferior (ptid_get_pid (child_ptid));
|
||||||
|
|
||||||
parent_inf = current_inferior ();
|
parent_inf = current_inferior ();
|
||||||
child_inf->attach_flag = parent_inf->attach_flag;
|
child_inf->attach_flag = parent_inf->attach_flag;
|
||||||
|
@ -483,7 +479,7 @@ holding the child stopped. Try \"set detach-on-fork\" or \
|
||||||
old_chain = save_inferior_ptid ();
|
old_chain = save_inferior_ptid ();
|
||||||
save_current_program_space ();
|
save_current_program_space ();
|
||||||
|
|
||||||
inferior_ptid = ptid_build (child_pid, child_pid, 0);
|
inferior_ptid = child_ptid;
|
||||||
add_thread (inferior_ptid);
|
add_thread (inferior_ptid);
|
||||||
child_inf->symfile_flags = SYMFILE_NO_READ;
|
child_inf->symfile_flags = SYMFILE_NO_READ;
|
||||||
|
|
||||||
|
@ -549,17 +545,16 @@ holding the child stopped. Try \"set detach-on-fork\" or \
|
||||||
{
|
{
|
||||||
target_terminal_ours_for_output ();
|
target_terminal_ours_for_output ();
|
||||||
fprintf_filtered (gdb_stdlog,
|
fprintf_filtered (gdb_stdlog,
|
||||||
_("Attaching after process %d "
|
_("Attaching after %s %s to child %s.\n"),
|
||||||
"%s to child process %d.\n"),
|
target_pid_to_str (parent_ptid),
|
||||||
parent_pid,
|
|
||||||
has_vforked ? "vfork" : "fork",
|
has_vforked ? "vfork" : "fork",
|
||||||
child_pid);
|
target_pid_to_str (child_ptid));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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. */
|
||||||
|
|
||||||
child_inf = add_inferior (child_pid);
|
child_inf = add_inferior (ptid_get_pid (child_ptid));
|
||||||
|
|
||||||
parent_inf = current_inferior ();
|
parent_inf = current_inferior ();
|
||||||
child_inf->attach_flag = parent_inf->attach_flag;
|
child_inf->attach_flag = parent_inf->attach_flag;
|
||||||
|
@ -596,8 +591,8 @@ holding the child stopped. Try \"set detach-on-fork\" or \
|
||||||
target_terminal_ours_for_output ();
|
target_terminal_ours_for_output ();
|
||||||
fprintf_filtered (gdb_stdlog,
|
fprintf_filtered (gdb_stdlog,
|
||||||
_("Detaching after fork from "
|
_("Detaching after fork from "
|
||||||
"child process %d.\n"),
|
"child %s.\n"),
|
||||||
child_pid);
|
target_pid_to_str (child_ptid));
|
||||||
}
|
}
|
||||||
|
|
||||||
target_detach (NULL, 0);
|
target_detach (NULL, 0);
|
||||||
|
@ -609,7 +604,7 @@ holding the child stopped. Try \"set detach-on-fork\" or \
|
||||||
this new thread, before cloning the program space, and
|
this new thread, before cloning the program space, and
|
||||||
informing the solib layer about this new process. */
|
informing the solib layer about this new process. */
|
||||||
|
|
||||||
inferior_ptid = ptid_build (child_pid, child_pid, 0);
|
inferior_ptid = child_ptid;
|
||||||
add_thread (inferior_ptid);
|
add_thread (inferior_ptid);
|
||||||
|
|
||||||
/* If this is a vfork child, then the address-space is shared
|
/* If this is a vfork child, then the address-space is shared
|
||||||
|
|
|
@ -387,20 +387,19 @@ linux_child_follow_fork (struct target_ops *ops, int follow_child,
|
||||||
int status = W_STOPCODE (0);
|
int status = W_STOPCODE (0);
|
||||||
struct cleanup *old_chain;
|
struct cleanup *old_chain;
|
||||||
int has_vforked;
|
int has_vforked;
|
||||||
|
ptid_t parent_ptid, child_ptid;
|
||||||
int parent_pid, child_pid;
|
int parent_pid, child_pid;
|
||||||
|
|
||||||
has_vforked = (inferior_thread ()->pending_follow.kind
|
has_vforked = (inferior_thread ()->pending_follow.kind
|
||||||
== TARGET_WAITKIND_VFORKED);
|
== TARGET_WAITKIND_VFORKED);
|
||||||
parent_pid = ptid_get_lwp (inferior_ptid);
|
parent_ptid = inferior_ptid;
|
||||||
if (parent_pid == 0)
|
child_ptid = inferior_thread ()->pending_follow.value.related_pid;
|
||||||
parent_pid = ptid_get_pid (inferior_ptid);
|
parent_pid = ptid_get_lwp (parent_ptid);
|
||||||
child_pid
|
child_pid = ptid_get_lwp (child_ptid);
|
||||||
= ptid_get_pid (inferior_thread ()->pending_follow.value.related_pid);
|
|
||||||
|
|
||||||
|
|
||||||
/* We're already attached to the parent, by default. */
|
/* We're already attached to the parent, by default. */
|
||||||
old_chain = save_inferior_ptid ();
|
old_chain = save_inferior_ptid ();
|
||||||
inferior_ptid = ptid_build (child_pid, child_pid, 0);
|
inferior_ptid = child_ptid;
|
||||||
child_lp = add_lwp (inferior_ptid);
|
child_lp = add_lwp (inferior_ptid);
|
||||||
child_lp->stopped = 1;
|
child_lp->stopped = 1;
|
||||||
child_lp->last_resume_kind = resume_stop;
|
child_lp->last_resume_kind = resume_stop;
|
||||||
|
@ -457,7 +456,7 @@ linux_child_follow_fork (struct target_ops *ops, int follow_child,
|
||||||
{
|
{
|
||||||
struct lwp_info *parent_lp;
|
struct lwp_info *parent_lp;
|
||||||
|
|
||||||
parent_lp = find_lwp_pid (pid_to_ptid (parent_pid));
|
parent_lp = find_lwp_pid (parent_ptid);
|
||||||
gdb_assert (linux_supports_tracefork () >= 0);
|
gdb_assert (linux_supports_tracefork () >= 0);
|
||||||
|
|
||||||
if (linux_supports_tracevforkdone ())
|
if (linux_supports_tracevforkdone ())
|
||||||
|
|
Loading…
Add table
Reference in a new issue