aboutsummaryrefslogtreecommitdiff
path: root/gdb/gdbserver
diff options
context:
space:
mode:
authorDaniel Jacobowitz <drow@false.org>2002-01-17 20:46:16 +0000
committerDaniel Jacobowitz <drow@false.org>2002-01-17 20:46:16 +0000
commit45b7b34510fbfca2ee2d43fe17130bbe3de0284c (patch)
tree456849e4b2aa0696ac11aaf50d51c0ecc29254ae /gdb/gdbserver
parent55baa95bb2644182e66ee00f1f3d406e6e09c290 (diff)
downloadgdb-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.c7
-rw-r--r--gdb/gdbserver/low-linux.c17
-rw-r--r--gdb/gdbserver/low-lynx.c7
-rw-r--r--gdb/gdbserver/low-nbsd.c7
-rw-r--r--gdb/gdbserver/low-sim.c7
-rw-r--r--gdb/gdbserver/low-sparc.c7
-rw-r--r--gdb/gdbserver/low-sun3.c7
-rw-r--r--gdb/gdbserver/server.c76
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 ();
}
}