From 598d363666e7b84f3dd5bf0f4cca83e856d77b1b Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Fri, 22 Mar 2013 20:39:29 +0000 Subject: [PATCH] gdb/ * exceptions.h (enum errors): New entry TARGET_CLOSE_ERROR. * remote.c (trace_error): Remove the special handling of '2'. (readchar) (readchar) (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. gdb/testsuite/ * gdb.server/server-kill.c: New file. * gdb.server/server-kill.exp: New file. --- gdb/ChangeLog | 16 +++++++++ gdb/exceptions.h | 4 +++ gdb/remote.c | 21 +++++++----- gdb/testsuite/ChangeLog | 6 ++++ gdb/testsuite/gdb.server/server-kill.c | 24 +++++++++++++ gdb/testsuite/gdb.server/server-kill.exp | 43 ++++++++++++++++++++++++ gdb/utils.c | 16 ++++++--- gdb/utils.h | 3 ++ 8 files changed, 121 insertions(+), 12 deletions(-) create mode 100644 gdb/testsuite/gdb.server/server-kill.c create mode 100644 gdb/testsuite/gdb.server/server-kill.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a4027c9e6bd..b446bd53a04 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,19 @@ +2013-03-22 Jan Kratochvil + + * exceptions.h (enum errors): New entry TARGET_CLOSE_ERROR. + * remote.c (trace_error): Remove the special handling of '2'. + (readchar) + (readchar) + (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 Yao Qi Mark Kettenis diff --git a/gdb/exceptions.h b/gdb/exceptions.h index 0d6771966ee..630eb2e56bd 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 f3206bc1694..c66618eb42d 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 5e47767e4d5..beadddb26be 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2013-03-22 Jan Kratochvil + Pedro Alves + + * gdb.server/server-kill.c: New file. + * gdb.server/server-kill.exp: New file. + 2013-03-21 Pedro Alves * 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 00000000000..1949d64966a --- /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 . */ + +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 00000000000..45a2a895464 --- /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 . + +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 a28c782ef94..a222c59ea18 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 9015c86b906..ad5bea47fd5 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); -- 2.30.2