[lttng-dev] Reading CTF trace using Babeltrace API
Mathieu Desnoyers
mathieu.desnoyers at efficios.com
Tue Oct 8 19:14:26 EDT 2013
----- Original Message -----
> From: "Jérémie Galarneau" <jeremie.galarneau at efficios.com>
> To: "Salman Rafiq" <salman.rafiq at esk.fraunhofer.de>
> Cc: jdesfossez at efficios.com, lttng-dev at lists.lttng.org, "Mathieu Desnoyers" <mathieu.desnoyers at efficios.com>
> Sent: Tuesday, October 8, 2013 2:52:38 PM
> Subject: Re: Reading CTF trace using Babeltrace API
[...]
>
> The problem is that the "id" fields in both struct
> event_header_compact and event_header_large acts as a variant's tag
> enumeration.
>
> For instance, if we take a look at the event_header_compact structure,
>
> struct event_header_compact {
> enum : uint5_t { compact = 0 ... 30, extended = 31 } id;
> variant <id> {
> struct {
> uint27_clock_monotonic_t timestamp;
> } compact;
> struct {
> uint32_t id;
> uint64_clock_monotonic_t timestamp;
> } extended;
> } v;
> } align(8);
>
> The "enum id" field will indicate the event's id if it has a value of
> [0, 30]. It also indicates that the "compact" structure is selected in
> the variant that follows. If id == 31, the "extended" structure is
> selected, which means that you should retrieve the "id" field's value
> from that structure.
>
> Since code is worth a thousand words, here's a more complete code
> sample to read the id fields.
>
> while ((ctf_event = bt_ctf_iter_read_event(iter))) {
> uint64_t event_id = 0;
> const struct bt_definition *stream_event_header_scope =
> bt_ctf_get_top_level_scope(
> ctf_event, BT_STREAM_EVENT_HEADER);
> const struct bt_definition *id_definition =
> bt_ctf_get_field(ctf_event, stream_event_header_scope,
> "id");
> const struct bt_definition *v_definition =
> bt_ctf_get_field(ctf_event, stream_event_header_scope,
> "v");
>
> /* "id may be an enum, get the underlying integer if it's the case */
> if (id_definition &&
> bt_ctf_field_type(bt_ctf_get_decl_from_def(id_definition)) ==
> CTF_TYPE_ENUM) {
> id_definition = bt_ctf_get_enum_int(id_definition);
> }
>
> /* Check if there is a "v" field and if it contains an "id" field */
> if (v_definition &&
> bt_ctf_field_type(bt_ctf_get_decl_from_def(v_definition)) ==
> CTF_TYPE_STRUCT) {
> struct bt_definition const * const *list = NULL;
> unsigned int count = 0;
> unsigned int i;
>
> ret = bt_ctf_get_field_list(ctf_event, v_definition,
> &list, &count);
> if (ret) {
> goto end;
> }
>
> for (i = 0; i < count; i++) {
> const char *name = bt_ctf_field_name(list[i]);
>
> if (strcmp("id", name) == 0) {
> id_definition = list[i];
> break;
> }
> }
Instead of doing this bt_ctf_get_field_list() and iteration, can't we simply use bt_ctf_get_field() to try getting the struct bt_definition ?
Thanks,
Mathieu
> }
>
> if (id_definition &&
> bt_ctf_field_type(bt_ctf_get_decl_from_def(id_definition)) ==
> CTF_TYPE_INTEGER) {
> event_id = bt_ctf_get_uint64(id_definition);
> }
>
> printf("id = %" PRIu64 "\n", event_id);
> }
>
> Regards,
> Jérémie
>
> > Thanks a lot!
> >
> > Regards,
> > Salman
> >
> > --
> > Salman Rafiq
> > Geschäftsfeld Industrial Communication
> > Fraunhofer-Institut für Eingebettete Systeme und Kommunikationstechnik ESK
> >
> > Hansastraße 32 | 80686 München
> > Telefon, Fax: +49 89 547088-356 | +49 89 547088-221
> > E-Mail: salman.rafiq at esk.fraunhofer.de
> >
> > Internet:
> > http://www.esk.fraunhofer.de
> > http://www.twitter.com/FraunhoferESK
> >
> >
> > -----Original Message-----
> > From: jeremie.galarneau at gmail.com [mailto:jeremie.galarneau at gmail.com] On
> > Behalf Of Jérémie Galarneau
> > Sent: Mittwoch, 2. Oktober 2013 20:25
> > To: Salman Rafiq
> > Cc: jdesfossez at efficios.com; lttng-dev at lists.lttng.org; Mathieu Desnoyers
> > Subject: Re: Reading CTF trace using Babeltrace API
> >
> > On Wed, Oct 2, 2013 at 12:55 PM, Salman Rafiq
> > <salman.rafiq at esk.fraunhofer.de> wrote:
> >> Dear LTTngers,
> >>
> >> I would like to ask few questions related to the API's for reading CTF
> >> traces.
> >>
> >> 1. Is there any way to read CTF metadata independently, like we have
> >> certain API's to read the events.
> >>
> >
> > Not from the public API, unfortunately.
> >
> >> 2. There are certain scopes defined in ctf/events.h like:
> >> BT_TRACE_PACKET_HEADER = 0,
> >> BT_STREAM_PACKET_CONTEXT = 1,
> >> BT_STREAM_EVENT_HEADER = 2,
> >> BT_STREAM_EVENT_CONTEXT = 3,
> >> BT_EVENT_CONTEXT = 4,
> >> BT_EVENT_FIELDS = 5,
> >>
> >> I could not figure out the way to ready the fields 'id' and 'stream_id',
> >> for a particular event while iterating through the trace.
> >> Though I can ready the event name using an API and fields using
> >> BT_EVENT_FIELDS as a scope.
> >> For e.g. consider the
> >>
> >> event {
> >> name = sched_migrate_task;
> >> id = 1;
> >> stream_id = 0;
> >> fields := struct {
> >> integer { size = 8; align = 8; signed = 1; encoding =
> >> UTF8; base = 10; } _comm[16];
> >> integer { size = 32; align = 8; signed = 1; encoding =
> >> none; base = 10; } _tid;
> >> integer { size = 32; align = 8; signed = 1; encoding =
> >> none; base = 10; } _prio;
> >> integer { size = 32; align = 8; signed = 1; encoding =
> >> none; base = 10; } _orig_cpu;
> >> integer { size = 32; align = 8; signed = 1; encoding =
> >> none; base = 10; } _dest_cpu;
> >> };
> >> };
> >>
> >
> > The "id" field is part of the BT_STREAM_EVENT_HEADER scope, while the
> > "stream_id" field is part of the BT_TRACE_PACKET_HEADER scope.
> >
> > The code below is adapted from converter/babeltrace.c's
> > convert_trace() loop to print both values.
> >
> > while ((ctf_event = bt_ctf_iter_read_event(iter))) {
> >
> > const struct bt_definition *stream_event_header_scope =
> > bt_ctf_get_top_level_scope(
> > ctf_event, BT_STREAM_EVENT_HEADER);
> > const struct bt_definition *id_field =
> > bt_ctf_get_field(
> > ctf_event, stream_event_header_scope, "id");
> >
> > printf("id = %" PRIu64 "\n", bt_ctf_get_uint64(id_field));
> >
> > const struct bt_definition *packet_header_scope =
> > bt_ctf_get_top_level_scope(
> > ctf_event, BT_TRACE_PACKET_HEADER);
> > const struct bt_definition *stream_id_field =
> > bt_ctf_get_field(
> > ctf_event, packet_header_scope, "stream_id");
> >
> > printf("stream_id = %" PRIu64 "\n", bt_ctf_get_uint64(
> > stream_id_field)); [...] }
> >
> > Regards,
> > Jérémie
> >
> >>
> >> Any help or suggestion related to this issue will be really appreciated.
> >> Thanks!
> >>
> >> Regards,
> >> Salman
> >>
> >> --
> >> Salman Rafiq
> >> Geschäftsfeld Industrial Communication Fraunhofer-Institut für
> >> Eingebettete Systeme und Kommunikationstechnik ESK
> >>
> >> Hansastraße 32 | 80686 München
> >> Telefon, Fax: +49 89 547088-356 | +49 89 547088-221
> >> E-Mail: salman.rafiq at esk.fraunhofer.de
> >>
> >> Internet:
> >> http://www.esk.fraunhofer.de
> >> http://www.twitter.com/FraunhoferESK
> >>
> >
> >
> >
> > --
> > Jérémie Galarneau
> > EfficiOS Inc.
> > http://www.efficios.com
>
>
>
> --
> Jérémie Galarneau
> EfficiOS Inc.
> http://www.efficios.com
>
--
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com
More information about the lttng-dev
mailing list