diff options
-rw-r--r-- | gdb/ChangeLog | 16 | ||||
-rw-r--r-- | gdb/exceptions.h | 4 | ||||
-rw-r--r-- | gdb/remote.c | 21 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/testsuite/gdb.server/server-kill.c | 24 | ||||
-rw-r--r-- | gdb/testsuite/gdb.server/server-kill.exp | 43 | ||||
-rw-r--r-- | gdb/utils.c | 16 | ||||
-rw-r--r-- | gdb/utils.h | 3 |
8 files changed, 121 insertions, 12 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a4027c9..b446bd5 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,19 @@ +2013-03-22 Jan Kratochvil <jan.kratochvil@redhat.com> + + * exceptions.h (enum errors): New entry TARGET_CLOSE_ERROR. + * remote.c (trace_error): Remove the special handling of '2'. + (readchar) <SERIAL_EOF> + (readchar) <SERIAL_ERROR> + (getpkt_or_notif_sane_1): Use TARGET_CLOSE_ERROR for them. + (remote_get_trace_status): Call throw_exception if EX is + TARGET_CLOSE_ERROR. + * utils.c (perror_with_name): Rename to ... + (throw_perror_with_name): ... here. New parameter errcode, describe it + in the function comment. + (perror_with_name): New function wrapper. + * utils.h (enum errors): New stub declaration. + (throw_perror_with_name): New declaration. + 2013-03-22 Pedro Alves <palves@redhat.com> Yao Qi <yao@codesourcery.com> Mark Kettenis <kettenis@gnu.org> diff --git a/gdb/exceptions.h b/gdb/exceptions.h index 0d67719..630eb2e 100644 --- a/gdb/exceptions.h +++ b/gdb/exceptions.h @@ -86,6 +86,10 @@ enum errors { /* DW_OP_GNU_entry_value resolving failed. */ NO_ENTRY_VALUE_ERROR, + /* Target throwing an error has been closed. Current command should be + aborted as the inferior state is no longer valid. */ + TARGET_CLOSE_ERROR, + /* Add more errors here. */ NR_ERRORS }; diff --git a/gdb/remote.c b/gdb/remote.c index f3206bc..c66618e 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -430,8 +430,6 @@ trace_error (char *buf) else error (_("remote.c: error in outgoing packet at field #%ld."), strtol (buf, NULL, 16)); - case '2': - error (_("trace API error 0x%s."), ++buf); default: error (_("Target returns error code '%s'."), buf); } @@ -7048,12 +7046,13 @@ readchar (int timeout) { case SERIAL_EOF: remote_unpush_target (); - error (_("Remote connection closed")); + throw_error (TARGET_CLOSE_ERROR, _("Remote connection closed")); /* no return */ case SERIAL_ERROR: remote_unpush_target (); - perror_with_name (_("Remote communication error. " - "Target disconnected.")); + throw_perror_with_name (TARGET_CLOSE_ERROR, + _("Remote communication error. " + "Target disconnected.")); /* no return */ case SERIAL_TIMEOUT: break; @@ -7576,7 +7575,9 @@ getpkt_or_notif_sane_1 (char **buf, long *sizeof_buf, int forever, { QUIT; remote_unpush_target (); - error (_("Watchdog timeout has expired. Target detached.")); + throw_error (TARGET_CLOSE_ERROR, + _("Watchdog timeout has expired. " + "Target detached.")); } if (remote_debug) fputs_filtered ("Timed out.\n", gdb_stdlog); @@ -10699,8 +10700,12 @@ remote_get_trace_status (struct trace_status *ts) } if (ex.reason < 0) { - exception_fprintf (gdb_stderr, ex, "qTStatus: "); - return -1; + if (ex.error != TARGET_CLOSE_ERROR) + { + exception_fprintf (gdb_stderr, ex, "qTStatus: "); + return -1; + } + throw_exception (ex); } /* If the remote target doesn't do tracing, flag it. */ diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 5e47767..beadddb 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2013-03-22 Jan Kratochvil <jan.kratochvil@redhat.com> + Pedro Alves <palves@redhat.com> + + * gdb.server/server-kill.c: New file. + * gdb.server/server-kill.exp: New file. + 2013-03-21 Pedro Alves <palves@redhat.com> * gdb.trace/trace-buffer-size.exp (get default buffer size): diff --git a/gdb/testsuite/gdb.server/server-kill.c b/gdb/testsuite/gdb.server/server-kill.c new file mode 100644 index 0000000..1949d64 --- /dev/null +++ b/gdb/testsuite/gdb.server/server-kill.c @@ -0,0 +1,24 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2013 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 <http://www.gnu.org/licenses/>. */ + +int +main (void) +{ + int i = 0; + + return i; +} diff --git a/gdb/testsuite/gdb.server/server-kill.exp b/gdb/testsuite/gdb.server/server-kill.exp new file mode 100644 index 0000000..45a2a89 --- /dev/null +++ b/gdb/testsuite/gdb.server/server-kill.exp @@ -0,0 +1,43 @@ +# This testcase is part of GDB, the GNU debugger. +# +# Copyright 2013 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 <http://www.gnu.org/licenses/>. + +load_lib gdbserver-support.exp + +standard_testfile + +if {[skip_gdbserver_tests]} { + return 0 +} + +if { [prepare_for_testing ${testfile}.exp ${testfile}] } { + return -1 +} + +# Make sure we're disconnected, in case we're testing with an +# extended-remote board, therefore already connected. +gdb_test "disconnect" ".*" + +gdbserver_run "" + +# Otherwise the breakpoint at 'main' would not cause insert +# breakpoints during first step. +delete_breakpoints + +set server_pid [exp_pid -i [board_info target fileid]] +remote_exec target "kill -9 $server_pid" + +gdb_test "step" "Remote connection closed" diff --git a/gdb/utils.c b/gdb/utils.c index a28c782..a222c59 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -966,11 +966,11 @@ add_internal_problem_command (struct internal_problem *problem) } /* Print the system error message for errno, and also mention STRING - as the file name for which the error was encountered. - Then return to command level. */ + as the file name for which the error was encountered. Use ERRCODE + for the thrown exception. Then return to command level. */ void -perror_with_name (const char *string) +throw_perror_with_name (enum errors errcode, const char *string) { char *err; char *combined; @@ -987,7 +987,15 @@ perror_with_name (const char *string) bfd_set_error (bfd_error_no_error); errno = 0; - error (_("%s."), combined); + throw_error (errcode, _("%s."), combined); +} + +/* See throw_perror_with_name, ERRCODE defaults here to GENERIC_ERROR. */ + +void +perror_with_name (const char *string) +{ + throw_perror_with_name (GENERIC_ERROR, string); } /* Print the system error message for ERRCODE, and also mention STRING diff --git a/gdb/utils.h b/gdb/utils.h index 9015c86..ad5bea4 100644 --- a/gdb/utils.h +++ b/gdb/utils.h @@ -278,6 +278,9 @@ extern char *hex_string_custom (LONGEST, int); extern void fprintf_symbol_filtered (struct ui_file *, const char *, enum language, int); +enum errors; +extern void throw_perror_with_name (enum errors errcode, const char *string) + ATTRIBUTE_NORETURN; extern void perror_with_name (const char *) ATTRIBUTE_NORETURN; extern void print_sys_errmsg (const char *, int); |