X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Finf-ptrace.c;h=64aaabe03ed5f1aa38cdd10353ae51fb76d15905;hb=e8b24d9ff5b9419fc079f5fe975fac6f499f8bfb;hp=861e57d10ac856f9f6447ca7a293380b7f6bc7cd;hpb=32d0add0a654c1204ab71dc8a55d9374538c4b33;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/inf-ptrace.c b/gdb/inf-ptrace.c index 861e57d10a..64aaabe03e 100644 --- a/gdb/inf-ptrace.c +++ b/gdb/inf-ptrace.c @@ -1,6 +1,6 @@ /* Low-level child interface to ptrace. - Copyright (C) 1988-2015 Free Software Foundation, Inc. + Copyright (C) 1988-2016 Free Software Foundation, Inc. This file is part of GDB. @@ -24,7 +24,7 @@ #include "terminal.h" #include "gdbcore.h" #include "regcache.h" -#include "gdb_ptrace.h" +#include "nat/gdb_ptrace.h" #include "gdb_wait.h" #include @@ -45,7 +45,8 @@ inf_ptrace_follow_fork (struct target_ops *ops, int follow_child, { if (!follow_child) { - pid_t child_pid = inferior_thread->pending_follow.value.related_pid; + struct thread_info *tp = inferior_thread (); + pid_t child_pid = ptid_get_pid (tp->pending_follow.value.related_pid); /* Breakpoints have already been detached from the child by infrun.c. */ @@ -57,6 +58,18 @@ inf_ptrace_follow_fork (struct target_ops *ops, int follow_child, return 0; } +static int +inf_ptrace_insert_fork_catchpoint (struct target_ops *self, int pid) +{ + return 0; +} + +static int +inf_ptrace_remove_fork_catchpoint (struct target_ops *self, int pid) +{ + return 0; +} + #endif /* PT_GET_PROCESS_STATE */ @@ -227,15 +240,7 @@ inf_ptrace_detach (struct target_ops *ops, const char *args, int from_tty) pid_t pid = ptid_get_pid (inferior_ptid); int sig = 0; - if (from_tty) - { - char *exec_file = get_exec_file (0); - if (exec_file == 0) - exec_file = ""; - printf_unfiltered (_("Detaching from program: %s, %s\n"), exec_file, - target_pid_to_str (pid_to_ptid (pid))); - gdb_flush (gdb_stdout); - } + target_announce_detach (from_tty); if (args) sig = atoi (args); @@ -252,6 +257,16 @@ inf_ptrace_detach (struct target_ops *ops, const char *args, int from_tty) error (_("This system does not support detaching from a process")); #endif + inf_ptrace_detach_success (ops); +} + +/* See inf-ptrace.h. */ + +void +inf_ptrace_detach_success (struct target_ops *ops) +{ + pid_t pid = ptid_get_pid (inferior_ptid); + inferior_ptid = null_ptid; detach_inferior (pid); @@ -272,13 +287,13 @@ inf_ptrace_kill (struct target_ops *ops) ptrace (PT_KILL, pid, (PTRACE_TYPE_ARG3)0, 0); waitpid (pid, &status, 0); - target_mourn_inferior (); + target_mourn_inferior (inferior_ptid); } -/* Stop the inferior. */ +/* Interrupt the inferior. */ static void -inf_ptrace_stop (struct target_ops *self, ptid_t ptid) +inf_ptrace_interrupt (struct target_ops *self, ptid_t ptid) { /* Send a SIGINT to the process group. This acts just like the user typed a ^C on the controlling terminal. Note that using a @@ -288,6 +303,22 @@ inf_ptrace_stop (struct target_ops *self, ptid_t ptid) kill (-inferior_process_group (), SIGINT); } +/* Return which PID to pass to ptrace in order to observe/control the + tracee identified by PTID. */ + +pid_t +get_ptrace_pid (ptid_t ptid) +{ + pid_t pid; + + /* If we have an LWPID to work with, use it. Otherwise, we're + dealing with a non-threaded program/target. */ + pid = ptid_get_lwp (ptid); + if (pid == 0) + pid = ptid_get_pid (ptid); + return pid; +} + /* Resume execution of thread PTID, or all threads if PTID is -1. If STEP is nonzero, single-step it. If SIGNAL is nonzero, give it that signal. */ @@ -296,13 +327,15 @@ static void inf_ptrace_resume (struct target_ops *ops, ptid_t ptid, int step, enum gdb_signal signal) { - pid_t pid = ptid_get_pid (ptid); + pid_t pid; int request; - if (pid == -1) + if (ptid_equal (minus_one_ptid, ptid)) /* Resume all threads. Traditionally ptrace() only supports single-threaded processes, so simply resume the inferior. */ pid = ptid_get_pid (inferior_ptid); + else + pid = get_ptrace_pid (ptid); if (catch_syscall_enabled () > 0) request = PT_SYSCALL; @@ -647,13 +680,15 @@ inf_ptrace_target (void) t->to_create_inferior = inf_ptrace_create_inferior; #ifdef PT_GET_PROCESS_STATE t->to_follow_fork = inf_ptrace_follow_fork; + t->to_insert_fork_catchpoint = inf_ptrace_insert_fork_catchpoint; + t->to_remove_fork_catchpoint = inf_ptrace_remove_fork_catchpoint; t->to_post_startup_inferior = inf_ptrace_post_startup_inferior; t->to_post_attach = inf_ptrace_post_attach; #endif t->to_mourn_inferior = inf_ptrace_mourn_inferior; t->to_thread_alive = inf_ptrace_thread_alive; t->to_pid_to_str = inf_ptrace_pid_to_str; - t->to_stop = inf_ptrace_stop; + t->to_interrupt = inf_ptrace_interrupt; t->to_xfer_partial = inf_ptrace_xfer_partial; #if defined (PT_IO) && defined (PIOD_READ_AUXV) t->to_auxv_parse = inf_ptrace_auxv_parse; @@ -695,7 +730,7 @@ inf_ptrace_fetch_register (struct regcache *regcache, int regnum) size = register_size (gdbarch, regnum); gdb_assert ((size % sizeof (PTRACE_TYPE_RET)) == 0); - buf = alloca (size); + buf = (PTRACE_TYPE_RET *) alloca (size); /* Read the register contents from the inferior a chunk at a time. */ for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++) @@ -753,7 +788,7 @@ inf_ptrace_store_register (const struct regcache *regcache, int regnum) size = register_size (gdbarch, regnum); gdb_assert ((size % sizeof (PTRACE_TYPE_RET)) == 0); - buf = alloca (size); + buf = (PTRACE_TYPE_RET *) alloca (size); /* Write the register contents into the inferior a chunk at a time. */ regcache_raw_collect (regcache, regnum, buf);