<div dir="ltr"><div>Thanks Philippe, I confirm that it works as you suggested.</div><div><br></div><div>metadata:</div><div><br></div><div><div>event {</div><div><span class="" style="white-space:pre"> </span>name = "foo";</div><div><span class="" style="white-space:pre">    </span>id = 0;</div><div><span class="" style="white-space:pre">    </span>stream_id = 0;</div><div><span class="" style="white-space:pre">     </span>fields := struct {</div><div><span class="" style="white-space:pre">         </span>uint32_t _len;<span class="" style="white-space:pre">            </span>/* byte len */</div><div><span class="" style="white-space:pre">             </span>uint8_t _num;<span class="" style="white-space:pre">             </span>/* number of strings */</div><div><span class="" style="white-space:pre">            </span>string _mgs[_num];<span class="" style="white-space:pre">        </span>/* concatenated strings (byte array) */</div><div><span class="" style="white-space:pre">    </span>};</div><div>};</div></div><div><br></div><div>code:<br></div><div><div>        char *msg = "a\0bb\0ccc\0";</div><div>        int len = 9;</div><div>        int num = 3;</div><div>        barectf_trace_foo(pctx, len, num, msg);</div></div><div><br></div><div>And the output of babeltrace:</div><div><br></div><div>[18:32:19.663305604] (+?.?????????) foo: { }, { len = 9, num = 3, mgs = [ [0] = "a", [1] = "bb", [2] = "ccc" ] }</div><div><br></div><div>I also tried the same trick with a struct, and it seems to work:</div><div><br></div><div>metadata:</div><div><br></div><div><div>struct blob {</div><div><span class="" style="white-space:pre">  </span>string _one;</div><div><span class="" style="white-space:pre">       </span>string _two;</div><div>};</div><div><br></div><div>event {</div><div><span class="" style="white-space:pre">       </span>name = "bar";</div><div><span class="" style="white-space:pre">    </span>id = 1;</div><div><span class="" style="white-space:pre">    </span>stream_id = 0;</div><div><span class="" style="white-space:pre">     </span>fields := struct {</div><div><span class="" style="white-space:pre">         </span>uint32_t _len;<span class="" style="white-space:pre">            </span>/* byte len */</div><div><span class="" style="white-space:pre">             </span>uint8_t _num;<span class="" style="white-space:pre">             </span>/* number of structs */</div><div><span class="" style="white-space:pre">            </span>struct blob _data[_num];<span class="" style="white-space:pre">  </span>/* byte array */</div><div><span class="" style="white-space:pre">   </span>};</div><div>};</div></div><div><br></div><div>code:</div><div><div><span class="" style="white-space:pre">    </span>msg = "aa\0bb\0cc\0dd\0";</div><div><span class="" style="white-space:pre">        </span>len = 12;</div><div><span class="" style="white-space:pre">  </span>num = 2;</div><div><span class="" style="white-space:pre">   </span>barectf_trace_bar(pctx, len, num, msg);</div></div><div><br></div><div>babeltrace output:</div><div><br></div><div><div>[18:40:37.695057872] (+0.000002364) bar: { }, { len = 12, num = 2, data = [ [0] = { one = "aa", two = "bb" }, [1] = { one = "cc", two = "dd" } ] }</div></div><div><br></div><div><br></div><div>Cheers!</div><div><br></div><div>Francis</div></div><div class="gmail_extra"><br><div class="gmail_quote">2015-01-19 19:16 GMT-05:00 Philippe Proulx <span dir="ltr"><<a href="mailto:eeppeliteloop@gmail.com" target="_blank">eeppeliteloop@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Mon, Jan 19, 2015 at 5:50 PM, Francis Giraldeau<br>
<<a href="mailto:francis.giraldeau@gmail.com">francis.giraldeau@gmail.com</a>> wrote:<br>
><br>
> Hi,<br>
><br>
> I would like to record a sequence of strings. Here is an example:<br>
><br>
> struct foo {<br>
>   string _my_string;<br>
> };<br>
><br>
> event {<br>
>   ...<br>
>   fields := struct {<br>
>     uint8_t _num;<br>
>     struct foo _items[_num];<br>
>   };<br>
> };<br>
><br>
> The program barectf does not allow it, and I wanted to know whether it's an implementation limitation or if CTF supports it at all.<br>
<br>
</div></div>Hi Francis,<br>
<br>
CTF and Babeltrace certainly allow this.<br>
<br>
It's a current barectf limitation: inner structures, as well as array/sequence<br>
elements must have a fixed size. This is because they are currently copied<br>
to the packet buffer as is using memcpy() with this precomputed fixed size.<br>
<br>
Your best approach today is to precompute the total length of all the<br>
concatenated strings (including terminating null characters) in your application<br>
code, and use a sequence of bytes instead, also keeping the original number<br>
of strings:<br>
<span class=""><br>
    event {<br>
      ...<br>
      fields := struct {<br>
</span>        uint32_t _len; /* length of all strings */<br>
        uint8_t _num; /* number of concatenated strings */<br>
        uint8_t _strings[_len];<br>
      };<br>
    };<br>
<br>
Then, after running barectf, change this for:<br>
<span class=""><br>
    event {<br>
      ...<br>
      fields := struct {<br>
</span>        uint32_t _len;<br>
        uint8_t _num;<br>
        string _strings[_num];<br>
      };<br>
    };<br>
<br>
and you should be able to see a sequence of strings in Babeltrace once<br>
your streams are produced by barectf C code.<br>
<br>
Ugly, but should work!<br>
<br>
Supporting variable-length inner structures and array/sequence elements<br>
is definitely on the TODO list for a future barectf release.<br>
<br>
Thanks for the input,<br>
Phil<br>
<br>
><br>
> Thanks,<br>
><br>
> Francis<br>
><br>
> _______________________________________________<br>
> lttng-dev mailing list<br>
> <a href="mailto:lttng-dev@lists.lttng.org">lttng-dev@lists.lttng.org</a><br>
> <a href="http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev" target="_blank">http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev</a><br>
><br>
</blockquote></div><br></div>