diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 7c482b0ddf..f29ecea162 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,16 @@ +2018-07-11 Pedro Alves + + PR gdb/23377 + * mem-break.c (any_persistent_commands): Add process_info + parameter and use it instead of relying on the current process. + Change return type to bool. + * mem-break.h (any_persistent_commands): Add process_info + parameter and change return type to bool. + * server.c (handle_detach): Remove require_running_or_return call. + Look up the process_info for the process we're about to detach. + If not found, return back error to GDB. Adjust + any_persistent_commands call to pass down a process pointer. + 2018-07-11 Pedro Alves * i387-fp.c (i387_cache_to_fsave, cache_to_fxsave) diff --git a/gdb/gdbserver/mem-break.c b/gdb/gdbserver/mem-break.c index 447afc7c10..60f64bd3cb 100644 --- a/gdb/gdbserver/mem-break.c +++ b/gdb/gdbserver/mem-break.c @@ -302,10 +302,9 @@ is_gdb_breakpoint (enum bkpt_type type) || type == gdb_breakpoint_Z4); } -int -any_persistent_commands (void) +bool +any_persistent_commands (process_info *proc) { - struct process_info *proc = current_process (); struct breakpoint *bp; struct point_command_list *cl; @@ -317,11 +316,11 @@ any_persistent_commands (void) for (cl = gdb_bp->command_list; cl != NULL; cl = cl->next) if (cl->persistence) - return 1; + return true; } } - return 0; + return false; } /* Find low-level breakpoint of type TYPE at address ADDR that is not diff --git a/gdb/gdbserver/mem-break.h b/gdb/gdbserver/mem-break.h index 019a87da09..7430c99883 100644 --- a/gdb/gdbserver/mem-break.h +++ b/gdb/gdbserver/mem-break.h @@ -125,7 +125,8 @@ int add_breakpoint_condition (struct gdb_breakpoint *bp, int add_breakpoint_commands (struct gdb_breakpoint *bp, const char **commands, int persist); -int any_persistent_commands (void); +/* Return true if PROC has any persistent command. */ +bool any_persistent_commands (process_info *proc); /* Evaluation condition (if any) at breakpoint BP. Return 1 if true and 0 otherwise. */ diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index e5d226c1a4..bf6302ba2d 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -1195,34 +1195,37 @@ static void handle_detach (char *own_buf) { client_state &cs = get_client_state (); - require_running_or_return (own_buf); - int pid; + process_info *process; if (cs.multi_process) { /* skip 'D;' */ - pid = strtol (&own_buf[2], NULL, 16); + int pid = strtol (&own_buf[2], NULL, 16); + + process = find_process_pid (pid); } else - pid = current_ptid.pid (); - - if ((tracing && disconnected_tracing) || any_persistent_commands ()) { - struct process_info *process = find_process_pid (pid); + process = (current_thread != nullptr + ? get_thread_process (current_thread) + : nullptr); + } - if (process == NULL) - { - write_enn (own_buf); - return; - } + if (process == NULL) + { + write_enn (own_buf); + return; + } + if ((tracing && disconnected_tracing) || any_persistent_commands (process)) + { if (tracing && disconnected_tracing) fprintf (stderr, "Disconnected tracing in effect, " "leaving gdbserver attached to the process\n"); - if (any_persistent_commands ()) + if (any_persistent_commands (process)) fprintf (stderr, "Persistent commands are present, " "leaving gdbserver attached to the process\n"); @@ -1250,13 +1253,13 @@ handle_detach (char *own_buf) return; } - fprintf (stderr, "Detaching from process %d\n", pid); + fprintf (stderr, "Detaching from process %d\n", process->pid); stop_tracing (); - if (detach_inferior (pid) != 0) + if (detach_inferior (process->pid) != 0) write_enn (own_buf); else { - discard_queued_stop_replies (ptid_t (pid)); + discard_queued_stop_replies (ptid_t (process->pid)); write_ok (own_buf); if (extended_protocol || target_running ()) @@ -1266,7 +1269,7 @@ handle_detach (char *own_buf) and instead treat this like a normal program exit. */ cs.last_status.kind = TARGET_WAITKIND_EXITED; cs.last_status.value.integer = 0; - cs.last_ptid = ptid_t (pid); + cs.last_ptid = ptid_t (process->pid); current_thread = NULL; } @@ -1278,7 +1281,7 @@ handle_detach (char *own_buf) /* If we are attached, then we can exit. Otherwise, we need to hang around doing nothing, until the child is gone. */ - join_inferior (pid); + join_inferior (process->pid); exit (0); } }