LIBTRACEEVENT(3)

✨ NAME ✨

trace_seq_init, trace_seq_destroy, trace_seq_reset, trace_seq_terminate, trace_seq_putc, trace_seq_puts, trace_seq_printf, trace_seq_vprintf, trace_seq_do_fprintf, trace_seq_do_printf β€” bestie, this is how you init and destroy a trace sequence πŸ’…

Ok so real quick before we dive in: this is a page from the libtraceevent Manual, lowercase-girlboss edition, and every single fact in it is preserved exactly. No cap. πŸ¦‹


🌸 SYNOPSIS 🌸

#include <event-parse.h>
#include <trace-seq.h>

void trace_seq_init(struct trace_seq *s);
void trace_seq_destroy(struct trace_seq *s);
void trace_seq_reset(struct trace_seq *s);
void trace_seq_terminate(struct trace_seq *s);
int trace_seq_putc(struct trace_seq *s, unsigned char c);
int trace_seq_puts(struct trace_seq *s, const char *str);
int trace_seq_printf(struct trace_seq *s, const char *fmt, ...);
int trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args);
int trace_seq_do_printf(struct trace_seq *s);
int trace_seq_do_fprintf(struct trace_seq *s, FILE *fp);

πŸ’– DESCRIPTION πŸ’–

So like… trace sequences are the moment. They exist so that a function can call a bunch of other functions and build up one string of data to use. It's giving "collab". It's giving "the group project actually worked". 🫢

  • trace_seq_init() β€” initializes the trace sequence s. Wake it up, bestie ✨
  • trace_seq_destroy() β€” destroys the trace sequence s and frees all its resources that it had used. She's done, she's clearing her cache, she's logging off πŸ‘‘
  • trace_seq_reset() β€” re-initializes the trace sequence s. All characters already written in s will be deleted. Gone, deleted, never happened πŸ’€
  • trace_seq_terminate() β€” terminates the trace sequence s. It puts the null character '\0' at the end of the buffer. Periodt, close the string πŸ’…
  • trace_seq_putc() β€” puts a single character c in the trace sequence s. One (1) character. Microdosing. πŸŽ€
  • trace_seq_puts() β€” puts a NULL terminated string str in the trace sequence s. The whole string, no chill 🌈
  • trace_seq_printf() β€” puts a formated string fmt with variable arguments ... in the trace sequence s. ✨
  • trace_seq_vprintf() β€” puts a formated string fmt with list of arguments args in the trace sequence s. Same energy, but you already had the args list ready 🧚
  • trace_seq_do_printf() β€” prints the buffer of trace sequence s to the standard output stdout. Say it out loud in the terminal, queen πŸ—£οΈ
  • trace_seq_do_fprintf() β€” prints the buffer of trace sequence s to the given file fp. Say it to the file instead πŸ“„

πŸ”₯ RETURN VALUE πŸ”₯

Both trace_seq_putc() and trace_seq_puts() functions return the number of characters put in the trace sequence, or 0 in case of an error.

Both trace_seq_printf() and trace_seq_vprintf() functions return 0 if the trace oversizes the buffer's free space, the number of characters printed, or a negative value in case of an error.

Both trace_seq_do_printf() and trace_seq_do_fprintf() functions return the number of printed characters, or -1 in case of an error.

bestie if you get 0 from printf/vprintf that is NOT a success, that is the buffer going "ma'am I have no room". Check your bounds. πŸ™ˆ

🌈 EXAMPLE 🌈

Copied verbatim from the original, typos and all, because facts don't get a glow-up:

#include <event-parse.h>
#include <trace-seq.h>
...
struct trace_seq seq;
trace_seq_init(&seq);
...
void foo_seq_print(struct trace_seq *tseq, char *format, ...)
{
        va_list ap;
        va_start(ap, format);
        if (trace_seq_vprintf(tseq, format, ap) <= 0) {
                /* Failed to print in the trace sequence */
        }
        va_end(ap);
}

trace_seq_reset(&seq);

char *str = " MAN page example";
if (trace_seq_puts(&seq, str) != strlen(str)) {
        /* Failed to put str in the trace sequence */
}
if (trace_seq_putc(&seq, ':') != 1) {
        /* Failed to put ':' in the trace sequence */
}
if (trace_seq_printf(&seq, " trace sequence: %d", 1) <= 0) {
        /* Failed to print in the trace sequence */
}
foo_seq_print( &seq, "  %d\n", 2);

trace_seq_terminate(&seq);
...

if (trace_seq_do_printf(&seq) < 0 ) {
        /* Failed to print the sequence buffer to the standard output */
}
FILE *fp = fopen("trace.txt", "w");
if (trace_seq_do_fprintf(&seq, fp) < 0 ) [
        /* Failed to print the sequence buffer to the trace.txt file */
}

trace_seq_destroy(&seq);
...
that [ at the end up there? not my typo, bestie β€” the original said that, and we keep every character. iykyk. 😭

πŸŽ€ FILES πŸŽ€

  • event-parse.h β€” Header file to include in order to have access to the library APIs.
  • trace-seq.h β€” Header file to include in order to have access to trace sequences related APIs.
  • -ltraceevent β€” Linker switch to add when building a program that uses the library.

πŸ’œ SEE ALSO πŸ’œ

libtraceevent(3), trace-cmd(1)

Go read those next, they're the sequel πŸ“š


✨ AUTHOR ✨

  • Steven Rostedt <rostedt@goodmis.org><sup>[1]</sup>, author of libtraceevent.
  • Tzvetomir Stoyanov <tz.stoyanov@gmail.com><sup>[2]</sup>, author of this man page.

Legends, both of them πŸ‘‘


πŸ¦‹ REPORTING BUGS πŸ¦‹

Report bugs to <linux-trace-devel@vger.kernel.org><sup>[3]</sup>

Found a bug? Tell the mailing list, don't suffer in silence, bestie 🫢

⭐ LICENSE ⭐

libtraceevent is Free Software licensed under the GNU LGPL 2.1


🌸 RESOURCES 🌸

https://git.kernel.org/pub/scm/libs/libtrace/libtraceevent.git/


πŸ“Ž NOTES πŸ“Ž

  1. rostedt@goodmis.org mailto:rostedt@goodmis.org
  2. tz.stoyanov@gmail.com mailto:tz.stoyanov@gmail.com
  3. linux-trace-devel@vger.kernel.org mailto:linux-trace-devel@vger.kernel.org

and that's the whole page, bestie πŸ’– drop a kudos to libtraceevent 1.9.0, dated 06/15/2026 β€” she ate and left no crumbs, LIBTRACEEVENT(3) out. πŸŽ€πŸ’…βœ¨

πŸ“¦ where this page comes from