Remove some GDBSERVER checks from linux-ptrace
This patch removes some GDBSERVER checks from nat/linux-ptrace.c. Currently the code uses a compile-time check to decide whether some flags should be used. This changes the code to instead let users of the module specify an additional set of flags; and then changes gdb's linux-nat.c to call this function. At some later date, when the back ends are fully merged, we will be able to remove this function again. gdb/ 2014-07-24 Tom Tromey <tromey@redhat.com> Gary Benson <gbenson@redhat.com> * nat/linux-ptrace.c (additional_flags): New global. (linux_test_for_tracesysgood, linux_test_for_tracefork): Use additional_flags; don't check GDBSERVER. (linux_ptrace_set_additional_flags): New function. * nat/linux-ptrace.h (linux_ptrace_set_additional_flags): Declare. * linux-nat.c (_initialize_linux_nat): Call linux_ptrace_set_additional_flags.
This commit is contained in:
parent
314c6a3559
commit
8009206ae2
4 changed files with 52 additions and 25 deletions
|
@ -1,3 +1,15 @@
|
|||
2014-07-24 Tom Tromey <tromey@redhat.com>
|
||||
Gary Benson <gbenson@redhat.com>
|
||||
|
||||
* nat/linux-ptrace.c (additional_flags): New global.
|
||||
(linux_test_for_tracesysgood, linux_test_for_tracefork): Use
|
||||
additional_flags; don't check GDBSERVER.
|
||||
(linux_ptrace_set_additional_flags): New function.
|
||||
* nat/linux-ptrace.h (linux_ptrace_set_additional_flags):
|
||||
Declare.
|
||||
* linux-nat.c (_initialize_linux_nat): Call
|
||||
linux_ptrace_set_additional_flags.
|
||||
|
||||
2014-07-24 Tom Tromey <tromey@redhat.com>
|
||||
|
||||
* make-target-delegates (munge_type, write_debugmethod): New
|
||||
|
|
|
@ -5033,6 +5033,14 @@ Enables printf debugging output."),
|
|||
sigdelset (&suspend_mask, SIGCHLD);
|
||||
|
||||
sigemptyset (&blocked_mask);
|
||||
|
||||
/* Do not enable PTRACE_O_TRACEEXIT until GDB is more prepared to
|
||||
support read-only process state. */
|
||||
linux_ptrace_set_additional_flags (PTRACE_O_TRACESYSGOOD
|
||||
| PTRACE_O_TRACEVFORKDONE
|
||||
| PTRACE_O_TRACEVFORK
|
||||
| PTRACE_O_TRACEFORK
|
||||
| PTRACE_O_TRACEEXEC);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -37,6 +37,10 @@
|
|||
there are no supported features. */
|
||||
static int current_ptrace_options = -1;
|
||||
|
||||
/* Additional flags to test. */
|
||||
|
||||
static int additional_flags;
|
||||
|
||||
/* Find all possible reasons we could fail to attach PID and append
|
||||
these as strings to the already initialized BUFFER. '\0'
|
||||
termination of BUFFER must be done by the caller. */
|
||||
|
@ -359,16 +363,16 @@ linux_check_ptrace_features (void)
|
|||
static void
|
||||
linux_test_for_tracesysgood (int child_pid)
|
||||
{
|
||||
#ifdef GDBSERVER
|
||||
/* gdbserver does not support PTRACE_O_TRACESYSGOOD. */
|
||||
#else
|
||||
int ret;
|
||||
|
||||
if ((additional_flags & PTRACE_O_TRACESYSGOOD) == 0)
|
||||
return;
|
||||
|
||||
ret = ptrace (PTRACE_SETOPTIONS, child_pid, (PTRACE_TYPE_ARG3) 0,
|
||||
(PTRACE_TYPE_ARG4) PTRACE_O_TRACESYSGOOD);
|
||||
|
||||
if (ret == 0)
|
||||
current_ptrace_options |= PTRACE_O_TRACESYSGOOD;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Determine if PTRACE_O_TRACEFORK can be used to follow fork
|
||||
|
@ -388,16 +392,15 @@ linux_test_for_tracefork (int child_pid)
|
|||
if (ret != 0)
|
||||
return;
|
||||
|
||||
#ifdef GDBSERVER
|
||||
/* gdbserver does not support PTRACE_O_TRACEVFORKDONE yet. */
|
||||
#else
|
||||
/* Check if the target supports PTRACE_O_TRACEVFORKDONE. */
|
||||
ret = ptrace (PTRACE_SETOPTIONS, child_pid, (PTRACE_TYPE_ARG3) 0,
|
||||
(PTRACE_TYPE_ARG4) (PTRACE_O_TRACEFORK
|
||||
| PTRACE_O_TRACEVFORKDONE));
|
||||
if (ret == 0)
|
||||
current_ptrace_options |= PTRACE_O_TRACEVFORKDONE;
|
||||
#endif
|
||||
if ((additional_flags & PTRACE_O_TRACEVFORKDONE) != 0)
|
||||
{
|
||||
/* Check if the target supports PTRACE_O_TRACEVFORKDONE. */
|
||||
ret = ptrace (PTRACE_SETOPTIONS, child_pid, (PTRACE_TYPE_ARG3) 0,
|
||||
(PTRACE_TYPE_ARG4) (PTRACE_O_TRACEFORK
|
||||
| PTRACE_O_TRACEVFORKDONE));
|
||||
if (ret == 0)
|
||||
current_ptrace_options |= PTRACE_O_TRACEVFORKDONE;
|
||||
}
|
||||
|
||||
/* Setting PTRACE_O_TRACEFORK did not cause an error, however we
|
||||
don't know for sure that the feature is available; old
|
||||
|
@ -433,18 +436,10 @@ linux_test_for_tracefork (int child_pid)
|
|||
|
||||
/* We got the PID from the grandchild, which means fork
|
||||
tracing is supported. */
|
||||
#ifdef GDBSERVER
|
||||
/* Do not enable all the options for now since gdbserver does not
|
||||
properly support them. This restriction will be lifted when
|
||||
gdbserver is augmented to support them. */
|
||||
current_ptrace_options |= PTRACE_O_TRACECLONE;
|
||||
#else
|
||||
current_ptrace_options |= PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK
|
||||
| PTRACE_O_TRACECLONE | PTRACE_O_TRACEEXEC;
|
||||
|
||||
/* Do not enable PTRACE_O_TRACEEXIT until GDB is more prepared to
|
||||
support read-only process state. */
|
||||
#endif
|
||||
current_ptrace_options |= (additional_flags & (PTRACE_O_TRACEFORK
|
||||
| PTRACE_O_TRACEVFORK
|
||||
| PTRACE_O_TRACEEXEC));
|
||||
|
||||
/* Do some cleanup and kill the grandchild. */
|
||||
my_waitpid (second_pid, &second_status, 0);
|
||||
|
@ -551,3 +546,14 @@ linux_ptrace_init_warnings (void)
|
|||
|
||||
linux_ptrace_test_ret_to_nx ();
|
||||
}
|
||||
|
||||
/* Set additional ptrace flags to use. Some such flags may be checked
|
||||
by the implementation above. This function must be called before
|
||||
any other function in this file; otherwise the flags may not take
|
||||
effect appropriately. */
|
||||
|
||||
void
|
||||
linux_ptrace_set_additional_flags (int flags)
|
||||
{
|
||||
additional_flags = flags;
|
||||
}
|
||||
|
|
|
@ -91,5 +91,6 @@ extern int linux_supports_tracefork (void);
|
|||
extern int linux_supports_traceclone (void);
|
||||
extern int linux_supports_tracevforkdone (void);
|
||||
extern int linux_supports_tracesysgood (void);
|
||||
extern void linux_ptrace_set_additional_flags (int);
|
||||
|
||||
#endif /* COMMON_LINUX_PTRACE_H */
|
||||
|
|
Loading…
Reference in a new issue