qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] RFC: Design Doc for a new trace format (to support vari


From: Stefan Hajnoczi
Subject: Re: [Qemu-devel] RFC: Design Doc for a new trace format (to support variable number/size of args per event) simpletrace-v2
Date: Tue, 29 Nov 2011 11:34:52 +0000

On Tue, Nov 29, 2011 at 8:29 AM, Harsh Bora <address@hidden> wrote:
> Currently, Qemu provides an in-built "simple" trace backend which is simple
> and easy to use (no additional/external dependencies) and allows developers
> to trace events in Qemu code, however, it suffers from limitations like
> unability to trace more than 6 elements per trace event, lack of string
> support, etc. There are various places in Qemu code, where one would want to
> trace events having multiple arguments including strings. This results into
> motivation for defining an advanced, yet simple trace format which will
> address these limitations. For the sake of convinence, let us call this new
> trace format as simpletrace v2 (any other better name?).
>
> HLD for Simpletrace v2:
> ======================
>
> This new trace format defines 3 types of structures for trace data
> organization:
>
> 1) Trace Log Header (per log file, provides meta-data about the entire trace
> log, like trace format version, endianness, etc.)
> 2) Trace Event Header (per trace event, provides meta-data per trace event)
> 3) Trace Data (per argument/data in a trace event, provides size of data
> followed by data itself)
>
>
>  The Trace Log header can be defined like this:
>
> typedef struct {
>        uint64_t endian_magic;  /* =0xAA0011FF, a magic number helps
> identifying validity and endian-ness of trace log to its readers */
>        uint64_t pid;           /* pid of qemu process can be traced here */
>        uint64_t version;       /* Keeping version info as 3rd 64-bit element
> as expected by current simpletrace format */
>        unit64_t timestamp;     /* timestamp info */
> } TraceLogHeader;
>
> Suggestions are invited to make this header more informative as required.
>
> Further, this TraceLogHeader will be followed by 0 or more Trace Event
> Headers (further followed by trace data) as defined below:
>
> typedef struct {
>        uint64_t magic;         /* =0xA1B2C3D4, ensures a valid trace record,
> otherwise corrupted */
>        unit64_t id;            /* unique identifer per trace event */
>        uint64_t timestamp;     /* timestamp info */
>        uint64_t num_args;      /* number of arguments (followed by this
> TraceEventHeader) traced in this trace event */

What exactly is num_args?

> } TraceEventHeader;
>
> Trace Data is expected to be stored in following format followed by
> TraceEventHeader:
>
> typedef struct {
>        uint64_t size;  /* size of data in bytes to be read following this
> header */
>        uint8_t data[0] /* variable sized data */
> } TraceData;

This format does not support variable-length strings in a
self-describing way.  What I mean is that a trace record containing a
string should work in the simpletrace Python module:

class QMPAnalyzer(simpletrace.Analyzer):
    def handle_qmp_command(self, mon, cmd_name):
        print 'QMP command "%s" on monitor %#x' % (cmd_name, mon)

The cmd_name argument is a string and this script shows all QMP
commands that were handled.

A simple way of implementing this is to have simpletrace.py parse
trace-events and look for (const) char * arguments.  String arguments
are serialized like this:

uint16_t length;
char chars[length];

It may be useful to pad to the next 8-byte boundary after a string argument.

Stefan



reply via email to

[Prev in Thread] Current Thread [Next in Thread]