From 45b7b34510fbfca2ee2d43fe17130bbe3de0284c Mon Sep 17 00:00:00 2001 From: Daniel Jacobowitz Date: Thu, 17 Jan 2002 20:46:16 +0000 Subject: [PATCH] 2002-01-17 Daniel Jacobowitz * low-hppabsd.c (myattach): New function, returning -1. * low-lynx.c (myattach): Likewise. * low-nbsd.c (myattach): Likewise. * low-sim.c (myattach): Likewise. * low-sparc.c (myattach): Likewise. * low-sun3.c (myattach): Likewise. * low-linux.c (myattach): New function. * server.c (attach_inferior): New function. (main): Handle "--attach". --- gdb/ChangeLog | 14 +++++++ gdb/gdbserver/low-hppabsd.c | 7 ++++ gdb/gdbserver/low-linux.c | 17 +++++++++ gdb/gdbserver/low-lynx.c | 7 ++++ gdb/gdbserver/low-nbsd.c | 7 ++++ gdb/gdbserver/low-sim.c | 7 ++++ gdb/gdbserver/low-sparc.c | 7 ++++ gdb/gdbserver/low-sun3.c | 7 ++++ gdb/gdbserver/server.c | 76 ++++++++++++++++++++++++++++++++----- 9 files changed, 140 insertions(+), 9 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2b36c57640c..19f658b6617 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,17 @@ +2002-01-17 Daniel Jacobowitz + + * low-hppabsd.c (myattach): New function, returning -1. + * low-lynx.c (myattach): Likewise. + * low-nbsd.c (myattach): Likewise. + * low-sim.c (myattach): Likewise. + * low-sparc.c (myattach): Likewise. + * low-sun3.c (myattach): Likewise. + + * low-linux.c (myattach): New function. + + * server.c (attach_inferior): New function. + (main): Handle "--attach". + 2002-01-16 Andrew Cagney * MAINTAINERS (language support): Daniel Jacobwitz is C++ diff --git a/gdb/gdbserver/low-hppabsd.c b/gdb/gdbserver/low-hppabsd.c index 86f21eadb38..af2a0e6e899 100644 --- a/gdb/gdbserver/low-hppabsd.c +++ b/gdb/gdbserver/low-hppabsd.c @@ -81,6 +81,13 @@ kill_inferior (void) /*************inferior_died ();****VK**************/ } +/* Attaching is not supported. */ +int +myattach (int pid) +{ + return -1; +} + /* Return nonzero if the given thread is still alive. */ int mythread_alive (int pid) diff --git a/gdb/gdbserver/low-linux.c b/gdb/gdbserver/low-linux.c index 0fd14af97ac..f2565d5d428 100644 --- a/gdb/gdbserver/low-linux.c +++ b/gdb/gdbserver/low-linux.c @@ -78,6 +78,23 @@ create_inferior (char *program, char **allargs) return pid; } +/* Attach to an inferior process. */ + +int +myattach (int pid) +{ + if (ptrace (PTRACE_ATTACH, pid, 0, 0) != 0) + { + fprintf (stderr, "Cannot attach to process %d: %s (%d)\n", pid, + errno < sys_nerr ? sys_errlist[errno] : "unknown error", + errno); + fflush (stderr); + _exit (0177); + } + + return 0; +} + /* Kill the inferior process. Make us have no inferior. */ void diff --git a/gdb/gdbserver/low-lynx.c b/gdb/gdbserver/low-lynx.c index e742207d65d..0aee1033b9e 100644 --- a/gdb/gdbserver/low-lynx.c +++ b/gdb/gdbserver/low-lynx.c @@ -87,6 +87,13 @@ create_inferior (char *program, char **allargs) return pid; } +/* Attaching is not supported. */ +int +myattach (int pid) +{ + return -1; +} + /* Kill the inferior process. Make us have no inferior. */ void diff --git a/gdb/gdbserver/low-nbsd.c b/gdb/gdbserver/low-nbsd.c index b6897e784de..188aca0c98e 100644 --- a/gdb/gdbserver/low-nbsd.c +++ b/gdb/gdbserver/low-nbsd.c @@ -145,6 +145,13 @@ create_inferior (char *program, char **allargs) return pid; } +/* Attaching is not supported. */ +int +myattach (int pid) +{ + return -1; +} + /* Kill the inferior process. Make us have no inferior. */ void diff --git a/gdb/gdbserver/low-sim.c b/gdb/gdbserver/low-sim.c index 92407d05c3f..39907e8ffb0 100644 --- a/gdb/gdbserver/low-sim.c +++ b/gdb/gdbserver/low-sim.c @@ -139,6 +139,13 @@ create_inferior (char *program, char **argv) return pid; } +/* Attaching is not supported. */ +int +myattach (int pid) +{ + return -1; +} + /* Kill the inferior process. Make us have no inferior. */ void diff --git a/gdb/gdbserver/low-sparc.c b/gdb/gdbserver/low-sparc.c index 7efaaeb0647..8b80e13eefd 100644 --- a/gdb/gdbserver/low-sparc.c +++ b/gdb/gdbserver/low-sparc.c @@ -75,6 +75,13 @@ create_inferior (char *program, char **allargs) return pid; } +/* Attaching is not supported. */ +int +myattach (int pid) +{ + return -1; +} + /* Kill the inferior process. Make us have no inferior. */ void diff --git a/gdb/gdbserver/low-sun3.c b/gdb/gdbserver/low-sun3.c index 4269d579524..a55f8a1df7a 100644 --- a/gdb/gdbserver/low-sun3.c +++ b/gdb/gdbserver/low-sun3.c @@ -72,6 +72,13 @@ create_inferior (char *program, char **allargs) return pid; } +/* Attaching is not supported. */ +int +myattach (int pid) +{ + return -1; +} + /* Kill the inferior process. Make us have no inferior. */ void diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index ab37b2ef079..5ed010bc6da 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -39,6 +39,21 @@ start_inferior (char *argv[], char *statusptr) return mywait (statusptr); } +static int +attach_inferior (int pid, char *statusptr, unsigned char *sigptr) +{ + /* myattach should return -1 if attaching is unsupported, + 0 if it succeeded, and call error() otherwise. */ + if (myattach (pid) != 0) + return -1; + + inferior_pid = pid; + + *sigptr = mywait (statusptr); + + return 0; +} + extern int remote_debug; int @@ -49,6 +64,10 @@ main (int argc, char *argv[]) unsigned char signal; unsigned int len; CORE_ADDR mem_addr; + int bad_attach = 0; + int pid = 0; + int attached = 0; + char *arg_end; if (setjmp (toplevel)) { @@ -56,15 +75,44 @@ main (int argc, char *argv[]) exit (1); } - if (argc < 3) - error ("Usage: gdbserver tty prog [args ...]"); + if (argc >= 3 && strcmp (argv[2], "--attach") == 0) + { + if (argc == 4 + && argv[3] != '\0' + && (pid = strtoul (argv[3], &arg_end, 10)) != 0 + && *arg_end == '\0') + { + ; + } + else + bad_attach = 1; + } + + if (argc < 3 || bad_attach) + error ("Usage:\tgdbserver tty prog [args ...]\n" + "\tgdbserver tty --attach pid"); initialize_low (); - /* Wait till we are at first instruction in program. */ - signal = start_inferior (&argv[2], &status); + if (pid == 0) + { + /* Wait till we are at first instruction in program. */ + signal = start_inferior (&argv[2], &status); - /* We are now stopped at the first instruction of the target process */ + /* We are now stopped at the first instruction of the target process */ + } + else + { + switch (attach_inferior (pid, &status, &signal)) + { + case -1: + error ("Attaching not supported on this target"); + break; + default: + attached = 1; + break; + } + } while (1) { @@ -83,8 +131,18 @@ main (int argc, char *argv[]) remote_debug = !remote_debug; break; case '!': - extended_protocol = 1; - prepare_resume_reply (own_buf, status, signal); + if (attached == 0) + { + extended_protocol = 1; + prepare_resume_reply (own_buf, status, signal); + } + else + { + /* We can not use the extended protocol if we are + attached, because we can not restart the running + program. So return unrecognized. */ + own_buf[0] = '\0'; + } break; case '?': prepare_resume_reply (own_buf, status, signal); @@ -250,8 +308,8 @@ main (int argc, char *argv[]) } else { - fprintf (stderr, "Remote side has terminated connection. GDBserver will reopen the connection.\n"); - + fprintf (stderr, "Remote side has terminated connection. " + "GDBserver will reopen the connection.\n"); remote_close (); } } -- 2.30.2