Mirror of the gdb-patches mailing list
 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>,
	Eli Zaretskii	<eliz@gnu.org>
Subject: RE: [patch v8 24/24] record-btrace: add (reverse-)stepping support
Date: Mon, 16 Dec 2013 15:56:00 -0000	[thread overview]
Message-ID: <A78C989F6D9628469189715575E55B230AA38F1D@IRSMSX104.ger.corp.intel.com> (raw)
In-Reply-To: <52AB5E6A.1010105@redhat.com>

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

Thanks for your review.


> > +  /* Clear the executing flag to allow changes to the current frame.  */
> > +  executing = is_executing (tp->ptid);
> > +  set_executing (tp->ptid, 0);
> 
> Why is this necessary?  Is this so you can start replaying
> even when the current thread is really executing?

No.  When we just start replaying with a reverse stepping command,
we need to recompute stack frames so we can compare them to
detect subroutine calls in infrun.c.

See also https://sourceware.org/ml/gdb-patches/2013-11/msg00874.html
and https://sourceware.org/ml/gdb-patches/2013-11/msg00891.html.

This function is called from to_wait to enable replaying as part of
reverse stepping.  We need to temporarily set is_executing to false
in order to be able to call get_current_frame below.

I extended the existing comments here and below to explain this in more detail.

> > +  /* Restore the previous execution state.  */
> > +  set_executing (tp->ptid, executing);
> > +
> > +  if (except.reason < 0)
> > +    throw_exception (except);
> 
> If something throws, things are being left
> possibly in an inconsistent state, it seems to me.
> Also, "replay" leaks.

Replay is stored in BTINFO.  We checked that we have trace before
the try block, so btrace_insn_end () won't throw and we're not
leaking REPLAY - we just transitioned from not replaying to replaying.

It may still be better to revert the changes and not start replaying
in case of errors.  Changed that.  I'm also calling registers_changed_ptid
and get_current_frame again to avoid leaving things behind that are
based on replaying.  This might trigger another throw.


> > +  if (tp != NULL && !btrace_is_replaying (tp)
> > +      && execution_direction != EXEC_REVERSE)
> > +    ALL_THREADS (other)
> > +      record_btrace_stop_replaying (other);
> 
> Why's that?

Imagine the user does:

(gdb) thread 1
(gdb) reverse-steop
(gdb) thread 2
(gdb) record goto 42
(gdb) thread 3
(gdb) continue

We could either error out and make him go to thread 1 and thread 2
again to stop replaying those threads.  Or we could more or less
silently stop replaying those other threads before we continue.

I chose to silently stop replaying; no warnings and no questions.
I find both somewhat annoying after some time.


> > +  /* Find the thread to move.  */
> > +  if (ptid_equal (minus_one_ptid, ptid) || ptid_is_pid (ptid))
> > +    {
> > +      ALL_THREADS (tp)
> > +	record_btrace_resume_thread (tp, flag);
> 
> Seems like this steps all threads, when gdb only wants to
> step inferior_ptid and continue others?

Only if gdb passes -1 or the ptid of the process.

In the end, we will move exactly one thread and keep all
others where they are.  This one thread will hit a breakpoint
or run out of execution history.

Are you suggesting that I should only mark inferior_ptid
in this case?  If I marked the others as continue, I would later
on need to prefer a thread that only wanted to step.

I'm preferring inferior_ptid in to_wait later on when the
threads are actually moved.  The effect should be the same,
but it might be more clear if I also did not mark the other
threads.


> > +	  if (breakpoint_here_p (aspace, insn->pc))
> > +	    return btrace_step_stopped ();
> 
> How is adjust_pc_after_break handled?

I'm not doing anything special.  The PC register is writable,
so the PC can be adjusted.  There is already code to omit
the adjustment when reverse-executing.


> > +# navigate in the trace history for both threads
> > +gdb_test "thread 1" ".*" "mts, 1.1"
> > +gdb_test "record goto begin" ".*" "mts, 1.2"
> > +gdb_test "info record" ".*Replay in progress\.  At instruction 1\." "mts,
> 1.3"
> > +gdb_test "thread 2" ".*" "mts, 1.4"
> > +gdb_test "record goto begin" ".*" "mts, 1.5"
> > +gdb_test "info record" ".*Replay in progress\.  At instruction 1\." "mts,
> 1.6"
> 
> What does this "mts" that appears everywhere mean?
> (with_test_prefix could help here to create more meaningful test names.)

It's a simple tag so I find the failing test quickly.

With_test_prefix wouldn't really help.  I could use "mts, " as test prefix, but
this would leave the raw numbers "1.1", "1.2", ... in the tests.

I don't really need the prefix since the failing .exp file is already included
in the fail message.  If it is confusing, I might as well omit it and use the numbers
only.


> > diff --git a/gdb/testsuite/gdb.btrace/rn-dl-bind.exp
> b/gdb/testsuite/gdb.btrace/rn-dl-bind.exp
> > new file mode 100644
> > index 0000000..4d803f9
> > --- /dev/null
> > +++ b/gdb/testsuite/gdb.btrace/rn-dl-bind.exp
> 
> What's this testing?  I can't infer it from the test name.
> Please add a comment.

It's testing a reverse-next over the dynamic linker's symbol lookup
code.  I added a comment to the top of the test.

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-16 15:56 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 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:15 ` [patch v8 01/24] btrace, linux: fix memory leak when reading branch trace Markus Metzger
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 02/24] btrace: uppercase btrace_read_type 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 [this message]
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 06/24] btrace: change branch trace data structure Markus Metzger
2013-12-12  9:16 ` [patch v8 09/24] btrace: increase buffer size Markus Metzger
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 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 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 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 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 13/24] target: add ops parameter to to_prepare_to_store method 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 04/24] frame: add frame_is_tailcall function Markus Metzger
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  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 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
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 18/24] record-btrace: add to_wait and to_resume target methods Markus Metzger
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 08/24] record-btrace: start counting at one Markus Metzger
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=A78C989F6D9628469189715575E55B230AA38F1D@IRSMSX104.ger.corp.intel.com \
    --to=markus.t.metzger@intel.com \
    --cc=eliz@gnu.org \
    --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