[lttng-dev] Reading CTF trace using Babeltrace API

Jérémie Galarneau jeremie.galarneau at efficios.com
Wed Oct 2 14:24:37 EDT 2013


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



More information about the lttng-dev mailing list