aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog16
-rw-r--r--gdb/exceptions.h4
-rw-r--r--gdb/remote.c21
-rw-r--r--gdb/testsuite/ChangeLog6
-rw-r--r--gdb/testsuite/gdb.server/server-kill.c24
-rw-r--r--gdb/testsuite/gdb.server/server-kill.exp43
-rw-r--r--gdb/utils.c16
-rw-r--r--gdb/utils.h3
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);