Thanks a lot,
Now I want to convert elog file to text file.
I compiled perftools in test directory, but when running c2cpel tools, the
following error accrued:

c2cpel: error while loading shared libraries: libcperf.so.0: cannot open
shared object file: No such file or directory

Best Regards,
Juan Salmon.

On Wed, Nov 29, 2017 at 3:53 PM, Dave Barach (dbarach) <dbar...@cisco.com>
wrote:

> PMFJI, but we have organized schemes for capturing, serializing, and
> eventually displaying string data.
>
>
>
> Please note: a single "format" call will probably cost more than *the
> entire clock-cycle budget* available to process a packet. Really.
> Seriously. Printfs (aka format calls) in the packet-processing path are to
> be avoided at all costs. The basic event-logger modus operandi is to
> capture binary data and pretty-print it offline.
>
>
>
> At times, one will need or want to log string data. Here's how to proceed:
>
>
>
> The printf-like function elog_string(...) adds a string to the event log
> string heap, and returns a cookie which offline tools use to print that
> string. The "T" format specifier in an event definition means "go print the
> string at the indicated u32 string heap offset”. Here’s an example:
>
>
>
>       /* *INDENT-OFF* */
>
>       ELOG_TYPE_DECLARE (e) =
>
>         {
>
>           .format = "serialize-msg: %s index %d",
>
>           .format_args = "T4i4",
>
>         };
>
>       struct
>
>         {
>
>         u32 c[2];
>
>       } *ed;
>
>       ed = ELOG_DATA (mc->elog_main, e);
>
>       ed->c[0] = elog_id_for_msg_name (mc, msg->name);
>
>       ed->c[1] = si;
>
>
>
> So far so good, but let’s do a bit of work to keep from blowing up the
> string heap:
>
>
>
> static u32
>
> elog_id_for_msg_name (mc_main_t * m, char *msg_name)
>
> {
>
>   uword *p, r;
>
>   uword *h = m->elog_id_by_msg_name;
>
>   u8 *name_copy;
>
>
>
>   if (!h)
>
>     h = m->elog_id_by_msg_name = hash_create_string (0, sizeof (uword));
>
>
>
>   p = hash_get_mem (h, msg_name);
>
>   if (p)
>
>     return p[0];
>
>   r = elog_string (m->elog_main, "%s", msg_name);
>
>
>
>   name_copy = format (0, "%s%c", msg_name, 0);
>
>
>
>   hash_set_mem (h, name_copy, r);
>
>   m->elog_id_by_msg_name = h;
>
>
>
>   return r;
>
> }
>
>
>
> As in: each unique string appears exactly once in the event-log string
> heap. Hash_get_mem (x) is way cheaper than printf(x). Please remember that
> this hash flavor is not inherently thread-safe.
>
>
>
> In the case of enumerated strings, use the “t” format specifier. It only
> costs 1 octet to represent up to 256 constant strings:
>
>
>
>   ELOG_TYPE_DECLARE (e) =
>
>   {
>
>     .format = "my enum: %s",
>
>     .format_args = "t1",
>
>     .n_enum_strings =
>
>       2,
>
>     .enum_strings =
>
>       {
>
>         "string 1",
>
>         "string 2",
>
>       },
>
>    };
>
>   struct
>
>   {
>
>     u8 which;
>
>   } *ed;
>
>   ed = ELOG_DATA (&vlib_global_main.elog_main, e);
>
>   ed->which = which;
>
>
>
>
>
> HTH… Dave
>
>
>
> -----Original Message-----
> From: vpp-dev-boun...@lists.fd.io [mailto:vpp-dev-boun...@lists.fd.io] On
> Behalf Of Florin Coras
> Sent: Wednesday, November 29, 2017 4:43 AM
> To: Juan Salmon <salmonju...@gmail.com>
> Cc: vpp-dev@lists.fd.io
> Subject: Re: [vpp-dev] problem in elog format
>
>
>
> Hi Juan,
>
>
>
> We don’t typically use elogs to store strings, still, you may be able to
> get it to run with:
>
>
>
>         struct
>
>         {
>
>             u8 err[20];
>
>         } * ed;
>
>
>
> And then copy your data to err: clib_memcpy (ed->err, your_vec, vec_len
> (your_vec)). Make sure your vec is 0 terminated.
>
>
>
> HTH,
>
> Florin
>
>
>
> > On Nov 28, 2017, at 9:12 PM, Juan Salmon <salmonju...@gmail.com> wrote:
>
> >
>
> >
>
> > I want to use event-log and send string to one of elements of ed struct.
>
> > but the result is not correct.
>
> >
>
> > the sample code:
>
> >
>
> > ELOG_TYPE_DECLARE (e) = {
>
> >                 .format = "Test LOG: %s",
>
> >                 .format_args = "s20",
>
> >         };
>
> >         struct
>
> >         {
>
> >             u8 * err;
>
> >         } * ed;
>
> >
>
> >
>
> >         vlib_worker_thread_t * w = vlib_worker_threads + cpu_index;
>
> >         ed = ELOG_TRACK_DATA (&vlib_global_main.elog_main, e,
> w->elog_track);
>
> >
>
> >         ed->err = format (0,"%s", "This is a Test");
>
> >
>
> >
>
> > Could you please help me?
>
> >
>
> >
>
> > Best Regards,
>
> > Juan Salmon.
>
> > _______________________________________________
>
> > vpp-dev mailing list
>
> > vpp-dev@lists.fd.io
>
> > https://lists.fd.io/mailman/listinfo/vpp-dev
>
>
>
> _______________________________________________
>
> vpp-dev mailing list
>
> vpp-dev@lists.fd.io
>
> https://lists.fd.io/mailman/listinfo/vpp-dev
>
_______________________________________________
vpp-dev mailing list
vpp-dev@lists.fd.io
https://lists.fd.io/mailman/listinfo/vpp-dev

Reply via email to