blob: db493cc6fd7d9f08b4240f522d2298746bc67173 [file] [log] [blame]
José Fonseca38ab5182014-05-23 21:16:11 +01001# Trace binary format specification #
2
3This document specifies the binary format of trace streams.
4
Jose Fonseca6c3d2672016-10-05 23:06:40 +01005## Compression ##
6
7Trace streams are not written verbatim to file, but compressed.
8
9By default traces are compressed with [Snappy](https://github.com/google/snappy)
10(see below for details). Previously they used to be compressed with gzip. And
11recently it also possible to have them compressed with
12[Brotli](https://github.com/google/brotli), though this is mostly intended for
13space savings on large databases of trace files.
14
15`apitrace repack` utility can be used to recompress the stream without any loss.
16
17### Snappy ###
18
19The used Snappy format is different from the standard _Snappy framing format_,
20because it predates it.
21
22 file = header chunk*
23
24 header = 'a' 't'
25
26 chunk = compressed_length compressed_data
27
28 compressed_length = uint32 // length of compressed data in little endian
29 compressed_data = byte*
José Fonseca38ab5182014-05-23 21:16:11 +010030
31
32## Versions ##
33
Jose Fonsecab5ce0152016-10-05 22:32:47 +010034We keep backwards compatibility reading old traces, i.e., it should always be
José Fonseca38ab5182014-05-23 21:16:11 +010035possible to parse and retrace old trace files.
36
37The trace version number refers not only to changes in the binary format
38representation, but also semantic changes in the way certain functions should
39be retraced.
40
41| `version_no` | Changes |
42| ------------ | ------- |
43| 0 | initial implementation |
44| 1 | support for OpenGL user arrays as blobs (whereas before calls that operated with user memory instead of VBOs should be ignored) |
45| 2 | malloc/free memory calls |
46| 3 | enums signatures with the whole set of name/value pairs |
47| 4 | call enter events include thread no |
48| 5 | support for call backtraces |
49
50Writing/editing old traces is not supported however. An older version of
Jose Fonsecab5ce0152016-10-05 22:32:47 +010051apitrace should be used in such circumstances.
José Fonseca38ab5182014-05-23 21:16:11 +010052
53
54## Basic types ##
55
56| Type | Description |
57| ---- | ----------- |
58| `byte` | Raw byte. |
Jose Fonsecab5ce0152016-10-05 22:32:47 +010059| `uint` | Variable-length unsigned integer, where the most significant bit is zero for last byte or non-zero if more bytes follow; the 7 least significant bits of each byte are used for the integer's bits, in little-endian order. |
José Fonseca38ab5182014-05-23 21:16:11 +010060| `float` | 32 bits single precision floating point number |
61| `double` | 64 bits single precision floating point number |
62
63Strings are length-prefixed. The trailing zero is implied, not appearing neither in the length prefix nor in the raw bytes.
64
65 string = count byte*
66
67 count = uint
68
69
70## Grammar ##
71
72The trace consists of a small header with version information, followed by an
73arbitrary number of events.
74
75 trace = version_no event*
76
77 version_no = uint
78
79### Calls ###
80
81Calls consist of an enter and leave event pair. Calls are numbered from zero,
82and the call number is implied for the enter event.
83
84 event = 0x00 thread_no call_sig call_detail+ // enter call (version_no >= 4)
85 | 0x00 call_sig call_detail+ // enter call (version_no < 4)
86 | 0x01 call_no call_detail+ // leave call
87
88 call_sig = id function_name count arg_name* // first occurrence
89 | id // follow-on occurrences
90
91 call_detail = 0x00 // terminator
92 | 0x01 arg_no value // argument value
93 | 0x02 value // return value
94 | 0x03 thread_no // thread number (version_no < 4)
95 | 0x04 count frame* // stack backtrace
96
97 arg_name = string
98 function_name = string
99
100 arg_no = uint
101 call_no = uint
102 thread_no = uint
103
104 id = uint
105
106### Values ###
107
108 value = 0x00 // null pointer
109 | 0x01 // false value
110 | 0x02 // true
111 | 0x03 uint // negative integer
112 | 0x04 uint // positive integer value
113 | 0x05 float // single-precision floating point value
114 | 0x06 double // double-precision floating point value
115 | 0x07 string // character string value (zero terminator implied)
116 | 0x08 string // binary blob
José Fonseca1ba7d252014-06-03 13:24:32 +0100117 | 0x09 enum_sig value // enumeration (version_no >= 3)
118 | 0x09 string value // enumeration (version_no < 3)
119 | 0x0a bitmask_sig value // integer bitmask
120 | 0x0b count value* // array
121 | 0x0c struct_sig value* // structure
122 | 0x0d uint // opaque pointer
123 | 0x0e value value // human-machine representation
José Fonsecad5cda7c2014-09-25 15:19:09 +0100124 | 0x0f wstring // wide character string value (zero terminator implied)
José Fonseca38ab5182014-05-23 21:16:11 +0100125
126 enum_sig = id count (name value)+ // first occurrence
127 | id // follow-on occurrences
128
Jose Fonsecab5ce0152016-10-05 22:32:47 +0100129 bitmask_sig = id count (name uint)+ // first occurrence
130 | id // follow-on occurrences
José Fonseca38ab5182014-05-23 21:16:11 +0100131
Jose Fonsecab5ce0152016-10-05 22:32:47 +0100132 struct_sig = id struct_name count member_name* // first occurrence
133 | id // follow-on occurrences
José Fonseca38ab5182014-05-23 21:16:11 +0100134
135 name = string
Jose Fonsecab5ce0152016-10-05 22:32:47 +0100136 struct_name = string
José Fonseca38ab5182014-05-23 21:16:11 +0100137 member_name = string
138
José Fonsecad5cda7c2014-09-25 15:19:09 +0100139 wstring = count uint*
140
José Fonseca38ab5182014-05-23 21:16:11 +0100141### Backtraces ###
142
143 frame = id frame_detail+ // first occurrence
144 | id // follow-on occurrences
145
146 frame_detail = 0x00 // terminator
147 | 0x01 string // module name
148 | 0x02 string // function name
149 | 0x03 string // source file name
150 | 0x04 uint // source line number
151 | 0x05 uint // byte offset from module start