aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog14
-rw-r--r--gdb/doc/ChangeLog5
-rw-r--r--gdb/doc/gdb.texinfo28
-rw-r--r--gdb/gdbserver/ChangeLog4
-rw-r--r--gdb/gdbserver/server.c7
-rw-r--r--gdb/remote.c66
6 files changed, 116 insertions, 8 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index e29ef67..71a74ea 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,17 @@
+2009-03-14 Pedro Alves <pedro@codesourcery.com>
+
+ * remote.c (PACKET_qAttached): New.
+ (remote_query_attached): New.
+ (remote_add_inferior): Add new `attached' argument. Handle it.
+ (remote_notice_new_inferior, remote_start_remote): Adjust to pass
+ -1 to remote_add_inferior in new parameter.
+ (extended_remote_attach_1): Adjust to pass 1 to
+ remote_add_inferior in the new parameter.
+ (extended_remote_create_inferior_1): Adjust to pass 0 to
+ remote_add_inferior in the new parameter.
+ (_initialize_remote): Add "set/show remote query-attached-packet"
+ commands.
+
2009-03-13 Tom Tromey <tromey@redhat.com>
* symtab.c (lookup_symbol_in_language): Use a cleanup.
diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog
index 2217332..65aa06b 100644
--- a/gdb/doc/ChangeLog
+++ b/gdb/doc/ChangeLog
@@ -1,3 +1,8 @@
+2009-03-14 Pedro Alves <pedro@codesourcery.com>
+
+ * gdb.texinfo (Remote Configuration): Document query-attached.
+ (General Query Packets): Document qAttached.
+
2009-03-05 Pedro Alves <pedro@codesourcery.com>
* gdb.texinfo (Background Execution): Better describe the set
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 5b3c50b..33bac26 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -14425,6 +14425,10 @@ are:
@item @code{osdata}
@tab @code{qXfer:osdata:read}
@tab @code{info os}
+
+@item @code{query-attached}
+@tab @code{qAttached}
+@tab Querying remote process attach state.
@end multitable
@node Remote Stub
@@ -27306,6 +27310,30 @@ not recognize the @var{object} keyword, or its support for
@var{object} does not recognize the @var{operation} keyword, the stub
must respond with an empty packet.
+@item qAttached:@var{pid}
+@cindex query attached, remote request
+@cindex @samp{qAttached} packet
+Return an indication of whether the remote server attached to an
+existing process or created a new process. When the multiprocess
+protocol extensions are supported (@pxref{multiprocess extensions}),
+@var{pid} is an integer in hexadecimal format identifying the target
+process. Otherwise, @value{GDBN} will omit the @var{pid} field and
+the query packet will be simplified as @samp{qAttached}.
+
+This query is used, for example, to know whether the remote process
+should be detached or killed when a @value{GDBN} session is ended with
+the @code{quit} command.
+
+Reply:
+@table @samp
+@item 1
+The remote server attached to an existing process.
+@item 0
+The remote server created a new process.
+@item E @var{NN}
+A badly formed request or an error was encountered.
+@end table
+
@end table
@node Register Packet Format
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index 89d088a..07d772d 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,3 +1,7 @@
+2009-03-14 Pedro Alves <pedro@codesourcery.com>
+
+ * server.c (handle_query): Handle "qAttached".
+
2009-03-13 Nathan Sidwell <nathan@codesourcery.com>
* Makefile.in, hostio-errno.c, errno.c, xtensa-xtregs.c: Change to
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index 416ceb3..0a51a7f 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -1040,6 +1040,13 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
return;
}
+ if (strcmp (own_buf, "qAttached") == 0)
+ {
+ require_running (own_buf);
+ strcpy (own_buf, attached ? "1" : "0");
+ return;
+ }
+
/* Otherwise we didn't know what packet it was. Say we didn't
understand it. */
own_buf[0] = 0;
diff --git a/gdb/remote.c b/gdb/remote.c
index 390924f..0c27307 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -992,6 +992,7 @@ enum {
PACKET_vKill,
PACKET_qXfer_siginfo_read,
PACKET_qXfer_siginfo_write,
+ PACKET_qAttached,
PACKET_MAX
};
@@ -1118,18 +1119,66 @@ static ptid_t any_thread_ptid;
static ptid_t general_thread;
static ptid_t continue_thread;
+/* Find out if the stub attached to PID (and hence GDB should offer to
+ detach instead of killing it when bailing out). */
+
+static int
+remote_query_attached (int pid)
+{
+ struct remote_state *rs = get_remote_state ();
+
+ if (remote_protocol_packets[PACKET_qAttached].support == PACKET_DISABLE)
+ return 0;
+
+ if (remote_multi_process_p (rs))
+ sprintf (rs->buf, "qAttached:%x", pid);
+ else
+ sprintf (rs->buf, "qAttached");
+
+ putpkt (rs->buf);
+ getpkt (&rs->buf, &rs->buf_size, 0);
+
+ switch (packet_ok (rs->buf,
+ &remote_protocol_packets[PACKET_qAttached]) == PACKET_OK)
+ {
+ case PACKET_OK:
+ if (strcmp (rs->buf, "1") == 0)
+ return 1;
+ break;
+ case PACKET_ERROR:
+ warning (_("Remote failure reply: %s"), rs->buf);
+ break;
+ case PACKET_UNKNOWN:
+ break;
+ }
+
+ return 0;
+}
+
/* Add PID to GDB's inferior table. Since we can be connected to a
remote system before before knowing about any inferior, mark the
- target with execution when we find the first inferior. */
+ target with execution when we find the first inferior. If ATTACHED
+ is 1, then we had just attached to this inferior. If it is 0, then
+ we just created this inferior. If it is -1, then try querying the
+ remote stub to find out if it had attached to the inferior or
+ not. */
static struct inferior *
-remote_add_inferior (int pid)
+remote_add_inferior (int pid, int attached)
{
struct remote_state *rs = get_remote_state ();
struct inferior *inf;
+ /* Check whether this process we're learning about is to be
+ considered attached, or if is to be considered to have been
+ spawned by the stub. */
+ if (attached == -1)
+ attached = remote_query_attached (pid);
+
inf = add_inferior (pid);
+ inf->attach_flag = attached;
+
/* This may be the first inferior we hear about. */
if (!target_has_execution)
{
@@ -1207,7 +1256,7 @@ remote_notice_new_inferior (ptid_t currthread, int running)
may not know about it yet. Add it before adding its child
thread, so notifications are emitted in a sensible order. */
if (!in_inferior_list (ptid_get_pid (currthread)))
- inf = remote_add_inferior (ptid_get_pid (currthread));
+ inf = remote_add_inferior (ptid_get_pid (currthread), -1);
/* This is really a new thread. Add it. */
remote_add_thread (currthread, running);
@@ -2665,7 +2714,7 @@ remote_start_remote (struct ui_out *uiout, void *opaque)
/* Now, if we have thread information, update inferior_ptid. */
inferior_ptid = remote_current_thread (inferior_ptid);
- remote_add_inferior (ptid_get_pid (inferior_ptid));
+ remote_add_inferior (ptid_get_pid (inferior_ptid), -1);
/* Always add the main thread. */
add_thread_silent (inferior_ptid);
@@ -3390,7 +3439,6 @@ extended_remote_attach_1 (struct target_ops *target, char *args, int from_tty)
int pid;
char *dummy;
char *wait_status = NULL;
- struct inferior *inf;
if (!args)
error_no_arg (_("process-id to attach"));
@@ -3436,8 +3484,7 @@ extended_remote_attach_1 (struct target_ops *target, char *args, int from_tty)
/* Now, if we have thread information, update inferior_ptid. */
inferior_ptid = remote_current_thread (inferior_ptid);
- inf = remote_add_inferior (pid);
- inf->attach_flag = 1;
+ remote_add_inferior (pid, 1);
if (non_stop)
/* Get list of threads. */
@@ -6761,7 +6808,7 @@ extended_remote_create_inferior_1 (char *exec_file, char *args,
/* Now, if we have thread information, update inferior_ptid. */
inferior_ptid = remote_current_thread (inferior_ptid);
- remote_add_inferior (ptid_get_pid (inferior_ptid));
+ remote_add_inferior (ptid_get_pid (inferior_ptid), 0);
add_thread_silent (inferior_ptid);
/* Get updated offsets, if the stub uses qOffsets. */
@@ -9161,6 +9208,9 @@ Show the maximum size of the address (in bits) in a memory packet."), NULL,
add_packet_config_cmd (&remote_protocol_packets[PACKET_vKill],
"vKill", "kill", 0);
+ add_packet_config_cmd (&remote_protocol_packets[PACKET_qAttached],
+ "qAttached", "query-attached", 0);
+
/* Keep the old ``set remote Z-packet ...'' working. Each individual
Z sub-packet has its own set and show commands, but users may
have sets to this variable in their .gdbinit files (or in their