diff options
author | Daniel Jacobowitz <drow@false.org> | 2002-01-17 20:46:16 +0000 |
---|---|---|
committer | Daniel Jacobowitz <drow@false.org> | 2002-01-17 20:46:16 +0000 |
commit | 45b7b34510fbfca2ee2d43fe17130bbe3de0284c (patch) | |
tree | 456849e4b2aa0696ac11aaf50d51c0ecc29254ae /gdb/gdbserver | |
parent | 55baa95bb2644182e66ee00f1f3d406e6e09c290 (diff) | |
download | gdb-45b7b34510fbfca2ee2d43fe17130bbe3de0284c.zip gdb-45b7b34510fbfca2ee2d43fe17130bbe3de0284c.tar.gz gdb-45b7b34510fbfca2ee2d43fe17130bbe3de0284c.tar.bz2 |
2002-01-17 Daniel Jacobowitz <drow@mvista.com>
* 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".
Diffstat (limited to 'gdb/gdbserver')
-rw-r--r-- | gdb/gdbserver/low-hppabsd.c | 7 | ||||
-rw-r--r-- | gdb/gdbserver/low-linux.c | 17 | ||||
-rw-r--r-- | gdb/gdbserver/low-lynx.c | 7 | ||||
-rw-r--r-- | gdb/gdbserver/low-nbsd.c | 7 | ||||
-rw-r--r-- | gdb/gdbserver/low-sim.c | 7 | ||||
-rw-r--r-- | gdb/gdbserver/low-sparc.c | 7 | ||||
-rw-r--r-- | gdb/gdbserver/low-sun3.c | 7 | ||||
-rw-r--r-- | gdb/gdbserver/server.c | 76 |
8 files changed, 126 insertions, 9 deletions
diff --git a/gdb/gdbserver/low-hppabsd.c b/gdb/gdbserver/low-hppabsd.c index 86f21ea..af2a0e6 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 0fd14af..f2565d5 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 e742207..0aee103 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 b6897e7..188aca0 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 92407d0..39907e8 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 7efaaeb..8b80e13 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 4269d57..a55f8a1 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 ab37b2e..5ed010b 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 (); } } |