diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c index fe4041662ef..bcfd3641ef5 100644 --- a/gdb/cli/cli-cmds.c +++ b/gdb/cli/cli-cmds.c @@ -488,7 +488,20 @@ quit_command (const char *args, int from_tty) if (!quit_confirm ()) error (_("Not confirmed.")); - query_if_trace_running (from_tty); + try + { + query_if_trace_running (from_tty); + } + catch (const gdb_exception_error &ex) + { + if (ex.error == TARGET_CLOSE_ERROR) + /* We don't care about this since we're quitting anyway, so keep + quitting. */ + exception_print (gdb_stderr, ex); + else + /* Rethrow, to properly handle error (_("Not confirmed.")). */ + throw; + } quit_force (args ? &exit_code : NULL, from_tty); } diff --git a/gdb/testsuite/gdb.server/monitor-exit-quit.exp b/gdb/testsuite/gdb.server/monitor-exit-quit.exp new file mode 100644 index 00000000000..fdf24520989 --- /dev/null +++ b/gdb/testsuite/gdb.server/monitor-exit-quit.exp @@ -0,0 +1,81 @@ +# This testcase is part of GDB, the GNU debugger. + +# Copyright 2022 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Test quitting after monitor exit. + +load_lib gdbserver-support.exp + +standard_testfile server.c + +if { [skip_gdbserver_tests] } { + return 0 +} + +if {[build_executable $testfile.exp $testfile $srcfile debug] == -1} { + return -1 +} + +save_vars { GDBFLAGS } { + # If GDB and GDBserver are both running locally, set the sysroot to avoid + # reading files via the remote protocol. + if { ![is_remote host] && ![is_remote target] } { + set GDBFLAGS "$GDBFLAGS -ex \"set sysroot\"" + } + + clean_restart $binfile +} + +# Make sure we're disconnected, in case we're testing with an +# extended-remote board, therefore already connected. +gdb_test "disconnect" ".*" + +set target_exec [gdbserver_download_current_prog] + +set res [gdbserver_start "" $target_exec] + +set gdbserver_protocol [lindex $res 0] +set gdbserver_gdbport [lindex $res 1] +gdb_target_cmd $gdbserver_protocol $gdbserver_gdbport + +gdb_test_no_output "monitor exit" +gdb_test_no_output "set confirm off" + +set do_cleanup 1 + +gdb_test_multiple "quit" "" { + -re -wrap "" { + fail "$gdb_test_name (prompt)" + # Let default_gdb_exit do the cleanup. + set do_cleanup 0 + } + -early -re "DOSEXIT code" { + pass "$gdb_test_name" + } + -early eof { + pass "$gdb_test_name" + } +} + +# Cleanup, as in default_gdb_exit. +if { $do_cleanup } { + if ![is_remote host] { + remote_close host + } + unset gdb_spawn_id + unset ::gdb_tty_name + unset inferior_spawn_id +}