public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: "Metzger, Markus T" <markus.t.metzger@intel.com>
To: Pedro Alves <palves@redhat.com>
Cc: "jan.kratochvil@redhat.com" <jan.kratochvil@redhat.com>,
	"gdb-patches@sourceware.org" <gdb-patches@sourceware.org>
Subject: RE: [patch v8 17/24] record-btrace: provide xfer_partial target method
Date: Tue, 17 Dec 2013 11:58:00 -0000	[thread overview]
Message-ID: <A78C989F6D9628469189715575E55B230AA395A5@IRSMSX104.ger.corp.intel.com> (raw)
In-Reply-To: <52AF5188.9040800@redhat.com>

> -----Original Message-----
> From: Pedro Alves [mailto:palves@redhat.com]
> Sent: Monday, December 16, 2013 8:16 PM


> > I changed the return -1 to throw_error (...) and added a check for
> > writebuf != NULL.  Suddenly I got tons of errors when GDB can't insert
> > breakpoints any longer for (reverse-)stepping.
> 
> This is why precord keeps track of breakpoints itself too:
[...] 
> >   Also stepping gets broken.
> 
> I can't immediately why that would be.

Because we can't set temporary breakpoints.


> > I now get an error when trying to access a variable with static storage
> > duration or when trying to access memory directly via its address.
> > It would be nice to also get an <unavailable> in those cases.  This would
> > require the respective layer to catch my exception.
> 
> Please try returning TARGET_XFER_E_UNAVAILABLE instead.

That is ignored just like the -1 I returned earlier.  I nevertheless changed
the default return to that since it is more descriptive.


> > To avoid those errors when trying to set breakpoints, I could try
> > providing to_insert_breakpoint and to_remove_breakpoint methods
> > and maintain my own breakpoints.
> 
> Right.

I have something to temporarily disable the xfer checks during
to_insert_breakpoint and to_remove_breakpoint.

Not sure whether this is considered too hacky or what else I'm missing.
My tests all pass.  Any idea where else GDB would need to access
target memory in order to function correctly?


Here's the patch.  I omit a preparation patch to pass target_ops to
to_insert_breakpoint and to_remove_breakpoint so that the request
can be forwarded to the target beneath.

diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c
index 00a056d..0536071 100644
--- a/gdb/record-btrace.c
+++ b/gdb/record-btrace.c
@@ -42,6 +42,9 @@ static struct target_ops record_btrace_ops;
 /* A new thread observer enabling branch tracing for the new thread.  */
 static struct observer *record_btrace_thread_observer;
 
+/* Temporarily allow memory accesses.  */
+static int record_btrace_allow_memory_access;
+
 /* Print a record-btrace debug message.  Use do ... while (0) to avoid
    ambiguities when used in if statements.  */
 
@@ -805,7 +808,7 @@ record_btrace_xfer_partial (struct target_ops *ops, enum target_object object,
   struct target_ops *t;
 
   /* Filter out requests that don't make sense during replay.  */
-  if (record_btrace_is_replaying ())
+  if (record_btrace_allow_memory_access == 0 && record_btrace_is_replaying ())
     {
       switch (object)
 	{
@@ -850,6 +853,58 @@ record_btrace_xfer_partial (struct target_ops *ops, enum target_object object,
   return TARGET_XFER_E_UNAVAILABLE;
 }
 
+/* The to_insert_breakpoint method of target record-btrace.  */
+
+static int
+record_btrace_insert_breakpoint (struct target_ops *ops,
+				 struct gdbarch *gdbarch,
+				 struct bp_target_info *bp_tgt)
+{
+  volatile struct gdb_exception except;
+  int old, ret;
+
+  /* Inserting breakpoints requires accessing memory.  Allow it for the
+     duration of this function.  */
+  old = record_btrace_allow_memory_access;
+  record_btrace_allow_memory_access = 1;
+
+  TRY_CATCH (except, RETURN_MASK_ALL)
+    ret = forward_target_insert_breakpoint (ops->beneath, gdbarch, bp_tgt);
+
+  record_btrace_allow_memory_access = old;
+
+  if (except.reason < 0)
+    throw_exception (except);
+
+  return ret;
+}
+
+/* The to_remove_breakpoint method of target record-btrace.  */
+
+static int
+record_btrace_remove_breakpoint (struct target_ops *ops,
+				 struct gdbarch *gdbarch,
+				 struct bp_target_info *bp_tgt)
+{
+  volatile struct gdb_exception except;
+  int old, ret;
+
+  /* Removing breakpoints requires accessing memory.  Allow it for the
+     duration of this function.  */
+  old = record_btrace_allow_memory_access;
+  record_btrace_allow_memory_access = 1;
+
+  TRY_CATCH (except, RETURN_MASK_ALL)
+    ret = forward_target_remove_breakpoint (ops->beneath, gdbarch, bp_tgt);
+
+  record_btrace_allow_memory_access = old;
+
+  if (except.reason < 0)
+    throw_exception (except);
+
+  return ret;
+}
+
 /* The to_fetch_registers method of target record-btrace.  */
 
 static void
@@ -1804,6 +1859,8 @@ init_record_btrace_ops (void)
   ops->to_call_history_range = record_btrace_call_history_range;
   ops->to_record_is_replaying = record_btrace_is_replaying;
   ops->to_xfer_partial = record_btrace_xfer_partial;
+  ops->to_remove_breakpoint = record_btrace_remove_breakpoint;
+  ops->to_insert_breakpoint = record_btrace_insert_breakpoint;
   ops->to_fetch_registers = record_btrace_fetch_registers;
   ops->to_store_registers = record_btrace_store_registers;
   ops->to_prepare_to_store = record_btrace_prepare_to_store;

Regards,
Markus.

Intel GmbH
Dornacher Strasse 1
85622 Feldkirchen/Muenchen, Deutschland
Sitz der Gesellschaft: Feldkirchen bei Muenchen
Geschaeftsfuehrer: Christian Lamprechter, Hannes Schwaderer, Douglas Lusk
Registergericht: Muenchen HRB 47456
Ust.-IdNr./VAT Registration No.: DE129385895
Citibank Frankfurt a.M. (BLZ 502 109 00) 600119052

  reply	other threads:[~2013-12-17 11:58 UTC|newest]

Thread overview: 73+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-12-12  9:15 [patch v8 00/24] record-btrace: reverse Markus Metzger
2013-12-12  9:15 ` [patch v8 03/24] gdbarch: add instruction predicate methods Markus Metzger
2013-12-12  9:15 ` [patch v8 01/24] btrace, linux: fix memory leak when reading branch trace Markus Metzger
2013-12-12  9:15 ` [patch v8 14/24] record-btrace: supply register target methods Markus Metzger
2013-12-12  9:15 ` [patch v8 16/24] record-btrace, frame: supply target-specific unwinder Markus Metzger
2013-12-12  9:16 ` [patch v8 24/24] record-btrace: add (reverse-)stepping support Markus Metzger
2013-12-12 16:36   ` Eli Zaretskii
2013-12-13 19:22   ` Pedro Alves
2013-12-16 15:56     ` Metzger, Markus T
2013-12-16 20:30       ` Pedro Alves
2013-12-17 14:14         ` Metzger, Markus T
2013-12-17 15:07           ` Metzger, Markus T
2013-12-17 15:48             ` Metzger, Markus T
2013-12-17 20:41               ` Pedro Alves
2013-12-17 20:34             ` Pedro Alves
2013-12-17 20:07           ` Pedro Alves
2013-12-18  9:44             ` Metzger, Markus T
2013-12-12  9:16 ` [patch v8 13/24] target: add ops parameter to to_prepare_to_store method Markus Metzger
2013-12-12  9:16 ` [patch v8 15/24] frame, backtrace: allow targets to supply a frame unwinder Markus Metzger
2013-12-13 18:27   ` Pedro Alves
2013-12-16  9:18     ` Metzger, Markus T
2013-12-16 19:02       ` Pedro Alves
2013-12-17  8:26         ` Metzger, Markus T
2013-12-17  9:48           ` Pedro Alves
2013-12-12  9:16 ` [patch v8 18/24] record-btrace: add to_wait and to_resume target methods Markus Metzger
2013-12-12  9:16 ` [patch v8 06/24] btrace: change branch trace data structure Markus Metzger
2013-12-12  9:16 ` [patch v8 08/24] record-btrace: start counting at one Markus Metzger
2013-12-12  9:16 ` [patch v8 02/24] btrace: uppercase btrace_read_type Markus Metzger
2013-12-12  9:16 ` [patch v8 09/24] btrace: increase buffer size Markus Metzger
2013-12-12  9:16 ` [patch v8 10/24] record-btrace: optionally indent function call history Markus Metzger
2013-12-12  9:16 ` [patch v8 21/24] record-btrace: extend unwinder Markus Metzger
2013-12-13 19:45   ` Pedro Alves
2013-12-16 12:42     ` Metzger, Markus T
2013-12-16 19:22       ` Pedro Alves
2013-12-17 12:56         ` Metzger, Markus T
2013-12-12  9:16 ` [patch v8 12/24] btrace: add replay position to btrace thread info Markus Metzger
2013-12-12  9:16 ` [patch v8 20/24] record-btrace: add record goto target methods Markus Metzger
2013-12-12  9:16 ` [patch v8 04/24] frame: add frame_is_tailcall function Markus Metzger
2013-12-12  9:16 ` [patch v8 11/24] record-btrace: make ranges include begin and end Markus Metzger
2013-12-13 17:56   ` Pedro Alves
2013-12-12  9:16 ` [patch v8 05/24] frame: artificial frame id's Markus Metzger
2013-12-12 19:39   ` Pedro Alves
2013-12-12 19:55     ` Jan Kratochvil
2013-12-13  8:04       ` Metzger, Markus T
2013-12-13 11:27         ` Jan Kratochvil
2013-12-13 11:42           ` Metzger, Markus T
2013-12-13 12:09         ` Pedro Alves
2013-12-13 13:01           ` Metzger, Markus T
2013-12-13 15:44             ` Pedro Alves
2013-12-13 17:51               ` Pedro Alves
2013-12-18 13:30                 ` Metzger, Markus T
2013-12-12  9:16 ` [patch v8 07/24] record-btrace: fix insn range in function call history Markus Metzger
2013-12-12  9:16 ` [patch v8 23/24] record-btrace: show trace from enable location Markus Metzger
2013-12-13 19:50   ` Pedro Alves
2013-12-16 12:57     ` Metzger, Markus T
2013-12-16 19:41       ` Pedro Alves
2013-12-17 13:20         ` Metzger, Markus T
2013-12-17 16:59           ` Pedro Alves
2013-12-12  9:16 ` [patch v8 19/24] record-btrace: provide target_find_new_threads method Markus Metzger
2013-12-12  9:16 ` [patch v8 17/24] record-btrace: provide xfer_partial target method Markus Metzger
2013-12-13 18:43   ` Pedro Alves
2013-12-16 10:53     ` Metzger, Markus T
2013-12-16 19:16       ` Pedro Alves
2013-12-17 11:58         ` Metzger, Markus T [this message]
2013-12-17 16:56           ` Pedro Alves
2013-12-18  9:26             ` Metzger, Markus T
2013-12-18 10:39               ` Pedro Alves
2013-12-12  9:16 ` [patch v8 22/24] btrace, gdbserver: read branch trace incrementally Markus Metzger
2013-12-13 19:46   ` Pedro Alves
2013-12-16 12:47     ` Metzger, Markus T
2013-12-16 19:23       ` Pedro Alves
2013-12-12 14:07 ` [patch v8 00/24] record-btrace: reverse Jan Kratochvil
2013-12-12 14:19   ` Metzger, Markus T

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=A78C989F6D9628469189715575E55B230AA395A5@IRSMSX104.ger.corp.intel.com \
    --to=markus.t.metzger@intel.com \
    --cc=gdb-patches@sourceware.org \
    --cc=jan.kratochvil@redhat.com \
    --cc=palves@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).