From: Simon Marchi <simon.marchi@polymtl.ca>
To: Simon Marchi <simon.marchi@ericsson.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [PATCH 2/2] gdbserver: Move detach code to its own function
Date: Fri, 15 Sep 2017 13:39:00 -0000 [thread overview]
Message-ID: <1bdaa1a6e4be7db9b3cc03244b4fdba4@polymtl.ca> (raw)
In-Reply-To: <1505482514-10206-2-git-send-email-simon.marchi@ericsson.com>
On 2017-09-15 15:35, Simon Marchi wrote:
> The code required to handle the 'D' packet is non trivial, so move it
> out to its own function.
>
> The moved out code is identical, except for the call to strtol and some
> breaks that became returns.
>
> Tested manually, and by running gdb.base/*detach*.exp with
> native-gdbserver and native-extended-gdbserver.
>
> gdb/gdbserver/ChangeLog:
>
> * server.c (handle_detach): New function.
> (process_serial_event): Move code out, call handle_detach.
> ---
> gdb/gdbserver/server.c | 179
> +++++++++++++++++++++++++------------------------
> 1 file changed, 93 insertions(+), 86 deletions(-)
>
> diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
> index 8e0bf5b..59d648d 100644
> --- a/gdb/gdbserver/server.c
> +++ b/gdb/gdbserver/server.c
> @@ -1157,6 +1157,98 @@ handle_search_memory (char *own_buf, int
> packet_len)
> free (pattern);
> }
>
> +static void
> +handle_detach (char *own_buf)
> +{
> + require_running_or_return (own_buf);
> +
> + int pid;
> +
> + if (multi_process)
> + {
> + /* skip 'D;' */
> + pid = strtol (&own_buf[2], NULL, 16);
> + }
> + else
> + pid = ptid_get_pid (current_ptid);
> +
> + if ((tracing && disconnected_tracing) || any_persistent_commands ())
> + {
> + struct process_info *process = find_process_pid (pid);
> +
> + if (process == NULL)
> + {
> + write_enn (own_buf);
> + return;
> + }
> +
> + if (tracing && disconnected_tracing)
> + fprintf (stderr,
> + "Disconnected tracing in effect, "
> + "leaving gdbserver attached to the process\n");
> +
> + if (any_persistent_commands ())
> + fprintf (stderr,
> + "Persistent commands are present, "
> + "leaving gdbserver attached to the process\n");
> +
> + /* Make sure we're in non-stop/async mode, so we we can both
> + wait for an async socket accept, and handle async target
> + events simultaneously. There's also no point either in
> + having the target stop all threads, when we're going to
> + pass signals down without informing GDB. */
> + if (!non_stop)
> + {
> + if (debug_threads)
> + debug_printf ("Forcing non-stop mode\n");
> +
> + non_stop = 1;
> + start_non_stop (1);
> + }
> +
> + process->gdb_detached = 1;
> +
> + /* Detaching implicitly resumes all threads. */
> + target_continue_no_signal (minus_one_ptid);
> +
> + write_ok (own_buf);
> + return;
> + }
> +
> + fprintf (stderr, "Detaching from process %d\n", pid);
> + stop_tracing ();
> + if (detach_inferior (pid) != 0)
> + write_enn (own_buf);
> + else
> + {
> + discard_queued_stop_replies (pid_to_ptid (pid));
> + write_ok (own_buf);
> +
> + if (extended_protocol || target_running ())
> + {
> + /* There is still at least one inferior remaining or
> + we are in extended mode, so don't terminate gdbserver,
> + and instead treat this like a normal program exit. */
> + last_status.kind = TARGET_WAITKIND_EXITED;
> + last_status.value.integer = 0;
> + last_ptid = pid_to_ptid (pid);
> +
> + current_thread = NULL;
> + }
> + else
> + {
> + putpkt (own_buf);
> + remote_close ();
> +
> + /* If we are attached, then we can exit. Otherwise, we
> + need to hang around doing nothing, until the child is
> + gone. */
> + join_inferior (pid);
> + exit (0);
> + }
> + }
> +}
> +
> /* Parse options to --debug-format= and "monitor set debug-format".
> ARG is the text after "--debug-format=" or "monitor set
> debug-format".
> IS_MONITOR is non-zero if we're invoked via "monitor set
> debug-format".
> @@ -4009,7 +4101,6 @@ process_serial_event (void)
> unsigned int len;
> int res;
> CORE_ADDR mem_addr;
> - int pid;
> unsigned char sig;
> int packet_len;
> int new_packet_len = -1;
> @@ -4037,91 +4128,7 @@ process_serial_event (void)
> handle_general_set (own_buf);
> break;
> case 'D':
> - require_running_or_break (own_buf);
> -
> - if (multi_process)
> - {
> - i++; /* skip ';' */
> - pid = strtol (&own_buf[i], NULL, 16);
> - }
> - else
> - pid = ptid_get_pid (current_ptid);
> -
> - if ((tracing && disconnected_tracing) || any_persistent_commands
> ())
> - {
> - struct process_info *process = find_process_pid (pid);
> -
> - if (process == NULL)
> - {
> - write_enn (own_buf);
> - break;
> - }
> -
> - if (tracing && disconnected_tracing)
> - fprintf (stderr,
> - "Disconnected tracing in effect, "
> - "leaving gdbserver attached to the process\n");
> -
> - if (any_persistent_commands ())
> - fprintf (stderr,
> - "Persistent commands are present, "
> - "leaving gdbserver attached to the process\n");
> -
> - /* Make sure we're in non-stop/async mode, so we we can both
> - wait for an async socket accept, and handle async target
> - events simultaneously. There's also no point either in
> - having the target stop all threads, when we're going to
> - pass signals down without informing GDB. */
> - if (!non_stop)
> - {
> - if (debug_threads)
> - debug_printf ("Forcing non-stop mode\n");
> -
> - non_stop = 1;
> - start_non_stop (1);
> - }
> -
> - process->gdb_detached = 1;
> -
> - /* Detaching implicitly resumes all threads. */
> - target_continue_no_signal (minus_one_ptid);
> -
> - write_ok (own_buf);
> - break; /* from switch/case */
> - }
> -
> - fprintf (stderr, "Detaching from process %d\n", pid);
> - stop_tracing ();
> - if (detach_inferior (pid) != 0)
> - write_enn (own_buf);
> - else
> - {
> - discard_queued_stop_replies (pid_to_ptid (pid));
> - write_ok (own_buf);
> -
> - if (extended_protocol || target_running ())
> - {
> - /* There is still at least one inferior remaining or
> - we are in extended mode, so don't terminate gdbserver,
> - and instead treat this like a normal program exit. */
> - last_status.kind = TARGET_WAITKIND_EXITED;
> - last_status.value.integer = 0;
> - last_ptid = pid_to_ptid (pid);
> -
> - current_thread = NULL;
> - }
> - else
> - {
> - putpkt (own_buf);
> - remote_close ();
> -
> - /* If we are attached, then we can exit. Otherwise, we
> - need to hang around doing nothing, until the child is
> - gone. */
> - join_inferior (pid);
> - exit (0);
> - }
> - }
> + handle_detach (own_buf);
> break;
> case '!':
> extended_protocol = 1;
Self-comment: the variable i in process_serial_event becomes useless,
I'll remove it before pushing.
next prev parent reply other threads:[~2017-09-15 13:39 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-09-15 13:35 [PATCH 1/2] Deduplicate require_running macros and move them up Simon Marchi
2017-09-15 13:35 ` [PATCH 2/2] gdbserver: Move detach code to its own function Simon Marchi
2017-09-15 13:39 ` Simon Marchi [this message]
2017-09-15 14:13 ` Pedro Alves
2017-09-15 16:01 ` Simon Marchi
2017-09-15 14:13 ` [PATCH 1/2] Deduplicate require_running macros and move them up Pedro Alves
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1bdaa1a6e4be7db9b3cc03244b4fdba4@polymtl.ca \
--to=simon.marchi@polymtl.ca \
--cc=gdb-patches@sourceware.org \
--cc=simon.marchi@ericsson.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox