From: "Metzger, Markus T" <markus.t.metzger@intel.com>
To: Jan Kratochvil <jan.kratochvil@redhat.com>
Cc: "gdb-patches@sourceware.org" <gdb-patches@sourceware.org>,
"Himpel, Christian" <christian.himpel@intel.com>
Subject: RE: [patch v4 03/24] btrace: change branch trace data structure
Date: Mon, 23 Sep 2013 06:54:00 -0000 [thread overview]
Message-ID: <A78C989F6D9628469189715575E55B230A9D4934@IRSMSX104.ger.corp.intel.com> (raw)
In-Reply-To: <20130921194413.GA20539@host2.jankratochvil.net>
> -----Original Message-----
> From: Jan Kratochvil [mailto:jan.kratochvil@redhat.com]
> Sent: Saturday, September 21, 2013 9:44 PM
> > > > > Unrelated to this patch but the function
> > > > > record_btrace_insn_history_from does not need to be virtualized. It
> > > > > does not access any internals of record-btrace.c, it could be fully
> > > > > implemented in the superclass record.c and to_insn_history_from
> > > > > could be deleted.
> > > > >
> > > > > The same applies for record_btrace_call_history_from and
> > > > > to_call_history_from.
> > > >
> > > > Both depend on the numbering scheme, which is an implementation
> detail.
> > > > They both assume that counting starts at 0 (at 1 in a later patch).
> > > >
> > > > This does not hold for record-full, where the lowest instruction may
> > > > be bigger than zero.
> > >
> > > OK, one reason is that currently there is no implementation of these
> > > methods for record-full:
> > > (gdb) record instruction-history
> > > You can't do that when your target is `record-full'
> > >
> > > The second reason is that while record-full can drop old record, seeing
> only
> > > the last window:
> > > (gdb) set record full insn-number-max 10
> > > (gdb) record
> > > (gdb) info record
> > > Active record target: record-full
> > > Record mode:
> > > Lowest recorded instruction number is 1587.
> > > Highest recorded instruction number is 1596.
> > > Log contains 10 instructions.
> > > Max logged instructions is 10.
> > >
> > > btrace backend does not seem to support such sliding window (the
> kernel
> > > buffer sliding is unrelated). GDB still stores in its memory all the btrace
> > > records and one cannot do anything like
> > > (gdb) set record btrace insn-number-max 10
> >
> > It's inherent in btrace. We only ever see the tail of the trace. We extend
> the
> > recorded trace when the kernel buffer does not overflow between
> updates.
> > Otherwise, we discard the trace in GDB and start anew with the current tail.
>
> (gdb) set record full insn-number-max 3
> (gdb) record
> (gdb) stepi
> (gdb) stepi
> (gdb) stepi
> (gdb) info record
> Active record target: record-full
> Record mode:
> Lowest recorded instruction number is 1.
> Highest recorded instruction number is 3.
> Log contains 3 instructions.
> Max logged instructions is 3.
> (gdb) stepi
> Do you want to auto delete previous execution log entries when
> record/replay buffer becomes full (record full stop-at-limit)?([y] or n) y
> (gdb) info record
> Active record target: record-full
> Record mode:
> Lowest recorded instruction number is 2.
> Highest recorded instruction number is 4.
> Log contains 3 instructions.
> Max logged instructions is 3.
>
> While 'record full' stores only the tail of selected size 'record btrace'
> stores everything and one has to occasionally 'record stop' and 'record
> btrace'
> again otherwise GDB runs out of memory. At least this is what I expect for
> long-term running inferiors, I do not have Haswell available to verify it.
When you trace a long running inferior with record btrace, you will only
get the tail of the trace - independent of how long you let it run.
The trace is collected in a cyclic buffer by the h/w. When the inferior
stops, GDB reads that buffer which corresponds to the tail of the
inferior's execution trace.
That is, GDB first tries to read the delta trace and try to stitch it to
the old trace from the previous read. This only works as long as the
cpu buffer does not overflow. In practice, this should work for
single-stepping with the occasional next over relatively short functions.
So if you keep on single-stepping for a very long time, you may indeed
exhaust GDB's memory. I don't think that this is a real issue in practice,
though.
As soon as you next over a big function or continue the inferior,
the h/w buffer will very likely overflow and you will again get the
tail of the trace. GDB will implicitly discard the old trace. It doesn't
know what happened between the old and the new trace.
> With btrace one cannot select the tail size (there is nothing like
> 'set record btrace insn-number-max 3'), perf_event_buffer_size() is
> auto-detected, 4MB max.
That's correct. I can't really come up with a good reason why you would
want less trace. Maybe if you had a real big number of threads or were
really just interested in the last handful of branches.
> I try to explain the numbering ranges X-Y (and not just 1-Y) should apply also
> to record btrace, not just to record full. btrace also needs to drop very old
> records and it is inconvenient for users to renumber the events all the time.
It's impossible for btrace to keep track of the number of instructions that have
been executed, so far, without increasing the overhead tremendously. GDB
would need to stop the debuggee before the trace buffer runs full and then
process the trace and either store it or discard it. This means very frequent
interrupts plus the time it takes for downloading and processing the trace.
> > The lowest recorded instruction is always zero for record-btrace.
>
> Which may cause GDB memory many-MB overflow if one traces long-running
> inferior, I guess.
No. It means that GDB renumbers the instructions each time the trace
buffer overflows. So zero (later changed to one) is always the first
instruction that is available in the recorded execution history.
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
next prev parent reply other threads:[~2013-09-23 6:54 UTC|newest]
Thread overview: 88+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-07-03 9:15 [patch v4 00/24] record-btrace: reverse Markus Metzger
2013-07-03 9:14 ` [patch v4 10/24] target: add ops parameter to to_prepare_to_store method Markus Metzger
2013-08-18 19:07 ` Jan Kratochvil
2013-07-03 9:14 ` [patch v4 19/24] btrace, linux: fix memory leak when reading branch trace Markus Metzger
2013-08-18 19:09 ` Jan Kratochvil
2013-07-03 9:14 ` [patch v4 03/24] btrace: change branch trace data structure Markus Metzger
2013-08-18 19:05 ` Jan Kratochvil
2013-09-10 9:11 ` Metzger, Markus T
2013-09-12 20:09 ` Jan Kratochvil
2013-09-16 9:01 ` Metzger, Markus T
2013-09-21 19:44 ` Jan Kratochvil
2013-09-23 6:54 ` Metzger, Markus T [this message]
2013-09-23 7:15 ` Jan Kratochvil
2013-09-23 7:27 ` Metzger, Markus T
2013-09-22 16:57 ` Jan Kratochvil
2013-09-22 17:16 ` Jan Kratochvil
2013-07-03 9:14 ` [patch v4 24/24] record-btrace: skip tail calls in back trace Markus Metzger
2013-08-18 19:10 ` Jan Kratochvil
2013-09-17 14:28 ` Metzger, Markus T
2013-09-18 8:28 ` Metzger, Markus T
2013-09-18 9:52 ` Metzger, Markus T
2013-07-03 9:14 ` [patch v4 20/24] btrace, gdbserver: read branch trace incrementally Markus Metzger
2013-08-18 19:09 ` Jan Kratochvil
2013-09-16 12:48 ` Metzger, Markus T
2013-09-22 14:42 ` Jan Kratochvil
2013-09-23 7:09 ` Metzger, Markus T
2013-09-25 19:05 ` Jan Kratochvil
2013-09-26 6:27 ` Metzger, Markus T
2013-07-03 9:14 ` [patch v4 11/24] record-btrace: supply register target methods Markus Metzger
2013-08-18 19:07 ` Jan Kratochvil
2013-09-16 9:19 ` Metzger, Markus T
2013-09-22 13:55 ` Jan Kratochvil
2013-09-23 6:55 ` Metzger, Markus T
2013-07-03 9:14 ` [patch v4 16/24] record-btrace: provide target_find_new_threads method Markus Metzger
2013-08-18 19:15 ` Jan Kratochvil
2013-07-03 9:14 ` [patch v4 07/24] record-btrace: optionally indent function call history Markus Metzger
2013-08-18 19:06 ` Jan Kratochvil
2013-09-10 13:06 ` Metzger, Markus T
2013-09-10 13:08 ` Jan Kratochvil
2013-07-03 9:14 ` [patch v4 08/24] record-btrace: make ranges include begin and end Markus Metzger
2013-08-18 19:12 ` Jan Kratochvil
2013-07-03 9:14 ` [patch v4 22/24] infrun: reverse stepping from unknown functions Markus Metzger
2013-08-18 19:09 ` Jan Kratochvil
2013-07-03 9:14 ` [patch v4 14/24] record-btrace: provide xfer_partial target method Markus Metzger
2013-08-18 19:08 ` Jan Kratochvil
2013-09-16 9:30 ` Metzger, Markus T
2013-09-22 14:18 ` Jan Kratochvil
2013-07-03 9:14 ` [patch v4 02/24] record: upcase record_print_flag enumeration constants Markus Metzger
2013-08-18 19:11 ` Jan Kratochvil
2013-07-03 9:14 ` [patch v4 05/24] record-btrace: start counting at one Markus Metzger
2013-08-18 19:11 ` Jan Kratochvil
2013-07-03 9:14 ` [patch v4 09/24] btrace: add replay position to btrace thread info Markus Metzger
2013-08-18 19:07 ` Jan Kratochvil
2013-09-10 13:24 ` Metzger, Markus T
2013-09-12 20:19 ` Jan Kratochvil
2013-07-03 9:15 ` [patch v4 04/24] record-btrace: fix insn range in function call history Markus Metzger
2013-08-18 19:06 ` Jan Kratochvil
2013-07-03 9:15 ` [patch v4 18/24] record-btrace: extend unwinder Markus Metzger
2013-08-18 19:08 ` Jan Kratochvil
2013-09-16 11:21 ` Metzger, Markus T
2013-09-27 13:55 ` Jan Kratochvil
2013-09-30 9:45 ` Metzger, Markus T
2013-09-30 10:26 ` Jan Kratochvil
2013-07-03 9:15 ` [patch v4 21/24] record-btrace: show trace from enable location Markus Metzger
2013-08-18 19:10 ` instruction_history.exp unset variable [Re: [patch v4 21/24] record-btrace: show trace from enable location] Jan Kratochvil
2013-09-16 14:11 ` Metzger, Markus T
2013-08-18 19:16 ` [patch v4 21/24] record-btrace: show trace from enable location Jan Kratochvil
2013-07-03 9:15 ` [patch v4 12/24] frame, backtrace: allow targets to supply a frame unwinder Markus Metzger
2013-08-18 19:14 ` Jan Kratochvil
2013-07-03 9:15 ` [patch v4 01/24] gdbarch: add instruction predicate methods Markus Metzger
2013-07-03 9:49 ` Mark Kettenis
2013-07-03 11:10 ` Metzger, Markus T
2013-08-18 19:04 ` Jan Kratochvil
2013-07-03 9:15 ` [patch v4 06/24] btrace: increase buffer size Markus Metzger
2013-08-18 19:06 ` Jan Kratochvil
2013-07-03 9:15 ` [patch v4 23/24] record-btrace: add (reverse-)stepping support Markus Metzger
2013-08-18 19:09 ` Jan Kratochvil
2013-09-17 9:43 ` Metzger, Markus T
2013-09-29 17:24 ` Jan Kratochvil
2013-09-30 9:30 ` Metzger, Markus T
2013-09-30 10:25 ` Jan Kratochvil
2013-07-03 9:15 ` [patch v4 15/24] record-btrace: add to_wait and to_resume target methods Markus Metzger
2013-08-18 19:08 ` Jan Kratochvil
2013-07-03 9:15 ` [patch v4 17/24] record-btrace: add record goto " Markus Metzger
2013-08-18 19:08 ` Jan Kratochvil
2013-07-03 9:15 ` [patch v4 13/24] record-btrace, frame: supply target-specific unwinder Markus Metzger
2013-08-18 19:07 ` Jan Kratochvil
2013-08-18 19:04 ` [patch v4 00/24] record-btrace: reverse Jan Kratochvil
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=A78C989F6D9628469189715575E55B230A9D4934@IRSMSX104.ger.corp.intel.com \
--to=markus.t.metzger@intel.com \
--cc=christian.himpel@intel.com \
--cc=gdb-patches@sourceware.org \
--cc=jan.kratochvil@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