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:
Pedro Alves 2009-03-14 01:38:08 +00:00
parent 57898e0296
commit 0b16c5cfaf
6 changed files with 116 additions and 8 deletions

View file

@ -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.

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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;

View file

@ -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