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.
This commit is contained in:
parent
5c3284c1ec
commit
9ee23a853c
|
@ -1,3 +1,10 @@
|
|||
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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
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 (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.";
|
||||
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -909,6 +909,9 @@ linux_enable_btrace (ptid_t ptid, const struct btrace_config *conf)
|
|||
break;
|
||||
}
|
||||
|
||||
if (tinfo == NULL)
|
||||
error (_("Unknown error."));
|
||||
|
||||
return tinfo;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue