From patchwork Fri Jan 26 14:14:29 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Metzger, Markus T" X-Patchwork-Id: 25579 Received: (qmail 117940 invoked by alias); 26 Jan 2018 14:14:39 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 117779 invoked by uid 89); 26 Jan 2018 14:14:38 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-23.9 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_LAZY_DOMAIN_SECURITY, T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy= X-HELO: mga01.intel.com Received: from mga01.intel.com (HELO mga01.intel.com) (192.55.52.88) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 26 Jan 2018 14:14:36 +0000 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 26 Jan 2018 06:14:35 -0800 X-ExtLoop1: 1 Received: from irvmail001.ir.intel.com ([163.33.26.43]) by orsmga003.jf.intel.com with ESMTP; 26 Jan 2018 06:14:34 -0800 Received: from ulvlx001.iul.intel.com (ulvlx001.iul.intel.com [172.28.207.17]) by irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id w0QEEXpE020628; Fri, 26 Jan 2018 14:14:33 GMT Received: from ulvlx001.iul.intel.com (localhost [127.0.0.1]) by ulvlx001.iul.intel.com with ESMTP id w0QEEXY2019591; Fri, 26 Jan 2018 15:14:33 +0100 Received: (from mmetzger@localhost) by ulvlx001.iul.intel.com with LOCAL id w0QEEX6r019587; Fri, 26 Jan 2018 15:14:33 +0100 From: Markus Metzger To: gdb-patches@sourceware.org Subject: [PATCH v2 4/7] btrace, gdbserver: use exceptions to convey btrace enable/disable errors Date: Fri, 26 Jan 2018 15:14:29 +0100 Message-Id: <1516976072-19282-5-git-send-email-markus.t.metzger@intel.com> In-Reply-To: <1516976072-19282-1-git-send-email-markus.t.metzger@intel.com> References: <1516976072-19282-1-git-send-email-markus.t.metzger@intel.com> X-IsSubscribed: yes 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. 2018-01-26 Markus Metzger 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. --- gdb/gdbserver/server.c | 55 ++++++++++++++++++++++---------------------------- gdb/nat/linux-btrace.c | 3 +++ gdb/x86-linux-nat.c | 19 +++++++++-------- 3 files changed, 38 insertions(+), 39 deletions(-) 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, ¤t_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, ¤t_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; }