2009-03-14 Pedro Alves <pedro@codesourcery.com>
gdb/ * 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-14 Pedro Alves <pedro@codesourcery.com> gdb/gdbserver/ * server.c (handle_query): Handle "qAttached". 2009-03-14 Pedro Alves <pedro@codesourcery.com> gdb/doc/ * gdb.texinfo (Remote Configuration): Document query-attached. (General Query Packets): Document qAttached.
This commit is contained in:
parent
57898e0296
commit
0b16c5cfaf
6 changed files with 116 additions and 8 deletions
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
66
gdb/remote.c
66
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
|
||||
|
|
Loading…
Reference in a new issue