gdb/
authorJan Kratochvil <jan.kratochvil@redhat.com>
Fri, 22 Mar 2013 20:39:29 +0000 (20:39 +0000)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Fri, 22 Mar 2013 20:39:29 +0000 (20:39 +0000)
* 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.

gdb/testsuite/
* gdb.server/server-kill.c: New file.
* gdb.server/server-kill.exp: New file.

gdb/ChangeLog
gdb/exceptions.h
gdb/remote.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.server/server-kill.c [new file with mode: 0644]
gdb/testsuite/gdb.server/server-kill.exp [new file with mode: 0644]
gdb/utils.c
gdb/utils.h

index a4027c9e6bde4bc575ca48c39383089bf9bc9cab..b446bd53a04d562e8594e1e26f09082df892216f 100644 (file)
@@ -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>
index 0d6771966ee443e5035eb52fdae917525a275c89..630eb2e56bda45c79a19276ba2a39d7b8637c171 100644 (file)
@@ -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
 };
index f3206bc1694ff4d7918e507d7e33affebecd8ea0..c66618eb42df84efd18b0d9674677f6c93e191d3 100644 (file)
@@ -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.  */
index 5e47767e4d5a390e729cb45a6d0b67c347171fba..beadddb26be9baf5a74a24e06708a4b19cf5a605 100644 (file)
@@ -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 (file)
index 0000000..1949d64
--- /dev/null
@@ -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 (file)
index 0000000..45a2a89
--- /dev/null
@@ -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"
index a28c782ef9415069d8c025b71920f836dae89784..a222c59ea1815bcfbacca02fa0b1a21b24dcec23 100644 (file)
@@ -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
index 9015c86b906b1e0b3ed634006d0f7e2ea0269f26..ad5bea47fd5da92cb14094cb44ecd9bc3676cf88 100644 (file)
@@ -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);
This page took 0.043385 seconds and 4 git commands to generate.