This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] btrace, gdbserver: use exceptions to convey btrace enable/disable errors


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=9ee23a853c18da3c83530c7957464bc6b6e9fb16

commit 9ee23a853c18da3c83530c7957464bc6b6e9fb16
Author: Markus Metzger <markus.t.metzger@intel.com>
Date:   Fri Jan 19 09:41:42 2018 +0100

    btrace, gdbserver: use exceptions to convey btrace enable/disable errors
    
    Change error reporting to use exceptions and be prepared to catch them in
    gdbserver.  We use the exception message in our error reply to GDB.
    
    This may remove some detail from the error message in the native case since
    errno is no longer printed.  Later patches will improve that.
    
    We're still using error strings on the RSP level.  This patch does not affect
    the interoperability of older/newer GDB/gdbserver.
    
    gdbserver/
    	* server.c (handle_btrace_enable_bts, handle_btrace_enable_pt)
    	(handle_btrace_disable): Change return type to void.  Use exceptions
    	to report errors.
    	(handle_btrace_general_set): Catch exception and copy message to
    	return message.
    
    gdb/
    	* nat/linux-btrace.c (linux_enable_btrace): Throw exception if enabling
    	btrace failed.
    	* x86-linux-nat.c (x86_linux_enable_btrace): Catch btrace enabling
    	exception and use message in own exception.

Diff:
---
 gdb/ChangeLog           |  7 +++++++
 gdb/gdbserver/ChangeLog |  8 +++++++
 gdb/gdbserver/server.c  | 55 +++++++++++++++++++++----------------------------
 gdb/nat/linux-btrace.c  |  3 +++
 gdb/x86-linux-nat.c     | 19 ++++++++++-------
 5 files changed, 53 insertions(+), 39 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 31d5334..3ff2ccf 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,12 @@
 2018-02-09  Markus Metzger  <markus.t.metzger@intel.com>
 
+	* nat/linux-btrace.c (linux_enable_btrace): Throw exception if enabling
+	btrace failed.
+	* x86-linux-nat.c (x86_linux_enable_btrace): Catch btrace enabling
+	exception and use message in own exception.
+
+2018-02-09  Markus Metzger  <markus.t.metzger@intel.com>
+
 	* nat/linux-btrace.c: Include scoped_fd.h and scoped_mmap.h.
 	(perf_event_pt_event_type): Use gdb_file_up.
 	(linux_enable_bts, linux_enable_pt): Use gdb::unique_xmalloc_ptr,
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index b80d820..1b8d6f6 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,3 +1,11 @@
+2018-02-09  Markus Metzger  <markus.t.metzger@intel.com>
+
+	* server.c (handle_btrace_enable_bts, handle_btrace_enable_pt)
+	(handle_btrace_disable): Change return type to void.  Use exceptions
+	to report errors.
+	(handle_btrace_general_set): Catch exception and copy message to
+	return message.
+
 2018-02-08  Tom Tromey  <tom@tromey.com>
 
 	* linux-low.c (install_software_single_step_breakpoints): Use
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index 9d12ce6..5ce6281 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -380,50 +380,41 @@ write_qxfer_response (char *buf, const gdb_byte *data, int len, int is_more)
 
 /* Handle btrace enabling in BTS format.  */
 
-static const char *
+static void
 handle_btrace_enable_bts (struct thread_info *thread)
 {
   if (thread->btrace != NULL)
-    return "E.Btrace already enabled.";
+    error (_("Btrace already enabled."));
 
   current_btrace_conf.format = BTRACE_FORMAT_BTS;
   thread->btrace = target_enable_btrace (thread->id, &current_btrace_conf);
-  if (thread->btrace == NULL)
-    return "E.Could not enable btrace.";
-
-  return NULL;
 }
 
 /* Handle btrace enabling in Intel Processor Trace format.  */
 
-static const char *
+static void
 handle_btrace_enable_pt (struct thread_info *thread)
 {
   if (thread->btrace != NULL)
-    return "E.Btrace already enabled.";
+    error (_("Btrace already enabled."));
 
   current_btrace_conf.format = BTRACE_FORMAT_PT;
   thread->btrace = target_enable_btrace (thread->id, &current_btrace_conf);
-  if (thread->btrace == NULL)
-    return "E.Could not enable btrace.";
-
-  return NULL;
 }
 
 /* Handle btrace disabling.  */
 
-static const char *
+static void
 handle_btrace_disable (struct thread_info *thread)
 {
 
   if (thread->btrace == NULL)
-    return "E.Branch tracing not enabled.";
+    error (_("Branch tracing not enabled."));
 
   if (target_disable_btrace (thread->btrace) != 0)
-    return "E.Could not disable branch tracing.";
+    error (_("Could not disable branch tracing."));
 
   thread->btrace = NULL;
-  return NULL;
 }
 
 /* Handle the "Qbtrace" packet.  */
@@ -432,7 +423,6 @@ static int
 handle_btrace_general_set (char *own_buf)
 {
   struct thread_info *thread;
-  const char *err;
   char *op;
 
   if (!startswith (own_buf, "Qbtrace:"))
@@ -454,21 +444,24 @@ handle_btrace_general_set (char *own_buf)
       return -1;
     }
 
-  err = NULL;
-
-  if (strcmp (op, "bts") == 0)
-    err = handle_btrace_enable_bts (thread);
-  else if (strcmp (op, "pt") == 0)
-    err = handle_btrace_enable_pt (thread);
-  else if (strcmp (op, "off") == 0)
-    err = handle_btrace_disable (thread);
-  else
-    err = "E.Bad Qbtrace operation. Use bts, pt, or off.";
+  TRY
+    {
+      if (strcmp (op, "bts") == 0)
+	handle_btrace_enable_bts (thread);
+      else if (strcmp (op, "pt") == 0)
+	handle_btrace_enable_pt (thread);
+      else if (strcmp (op, "off") == 0)
+	handle_btrace_disable (thread);
+      else
+	error (_("Bad Qbtrace operation.  Use bts, pt, or off."));
 
-  if (err != 0)
-    strcpy (own_buf, err);
-  else
-    write_ok (own_buf);
+      write_ok (own_buf);
+    }
+  CATCH (exception, RETURN_MASK_ERROR)
+    {
+      sprintf (own_buf, "E.%s", exception.message);
+    }
+  END_CATCH
 
   return 1;
 }
diff --git a/gdb/nat/linux-btrace.c b/gdb/nat/linux-btrace.c
index 354094f..2b37e41 100644
--- a/gdb/nat/linux-btrace.c
+++ b/gdb/nat/linux-btrace.c
@@ -909,6 +909,9 @@ linux_enable_btrace (ptid_t ptid, const struct btrace_config *conf)
       break;
     }
 
+  if (tinfo == NULL)
+    error (_("Unknown error."));
+
   return tinfo;
 }
 
diff --git a/gdb/x86-linux-nat.c b/gdb/x86-linux-nat.c
index 46bb6a4..75f68de 100644
--- a/gdb/x86-linux-nat.c
+++ b/gdb/x86-linux-nat.c
@@ -216,14 +216,17 @@ static struct btrace_target_info *
 x86_linux_enable_btrace (struct target_ops *self, ptid_t ptid,
 			 const struct btrace_config *conf)
 {
-  struct btrace_target_info *tinfo;
-
-  errno = 0;
-  tinfo = linux_enable_btrace (ptid, conf);
-
-  if (tinfo == NULL)
-    error (_("Could not enable branch tracing for %s: %s."),
-	   target_pid_to_str (ptid), safe_strerror (errno));
+  struct btrace_target_info *tinfo = nullptr;
+  TRY
+    {
+      tinfo = linux_enable_btrace (ptid, conf);
+    }
+  CATCH (exception, RETURN_MASK_ERROR)
+    {
+      error (_("Could not enable branch tracing for %s: %s"),
+	     target_pid_to_str (ptid), exception.message);
+    }
+  END_CATCH
 
   return tinfo;
 }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]