blob: ffae0ae703b65a9c84e879ba8d89cb094676bd04 [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*
Jose Fonsecac110dbc2017-06-23 13:04:17 +010023
Jose Fonseca6c3d2672016-10-05 23:06:40 +010024 header = 'a' 't'
Jose Fonsecac110dbc2017-06-23 13:04:17 +010025
Jose Fonseca6c3d2672016-10-05 23:06:40 +010026 chunk = compressed_length compressed_data
Jose Fonsecac110dbc2017-06-23 13:04:17 +010027
Jose Fonseca6c3d2672016-10-05 23:06:40 +010028 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 |
Jose Fonsecaaf0d45b2017-06-28 22:35:37 +010049| 6 | unicode strings; semantic version; properties; fake flag |
José Fonseca38ab5182014-05-23 21:16:11 +010050
51Writing/editing old traces is not supported however. An older version of
Jose Fonsecab5ce0152016-10-05 22:32:47 +010052apitrace should be used in such circumstances.
José Fonseca38ab5182014-05-23 21:16:11 +010053
54
55## Basic types ##
56
57| Type | Description |
58| ---- | ----------- |
59| `byte` | Raw byte. |
Jose Fonsecab5ce0152016-10-05 22:32:47 +010060| `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 +010061| `float` | 32 bits single precision floating point number |
62| `double` | 64 bits single precision floating point number |
63
64Strings are length-prefixed. The trailing zero is implied, not appearing neither in the length prefix nor in the raw bytes.
65
66 string = count byte*
67
68 count = uint
69
70
71## Grammar ##
72
73The trace consists of a small header with version information, followed by an
74arbitrary number of events.
75
Jose Fonsecac110dbc2017-06-23 13:04:17 +010076 trace = header event*
77
78 header = version_no semantic_version_no properties // version_no >= 6
79 | version_no // version_no < 6
José Fonseca38ab5182014-05-23 21:16:11 +010080
81 version_no = uint
Jose Fonsecae8a5de72017-06-22 15:18:52 +010082 semantic_version_no = uint
83
José Fonseca38ab5182014-05-23 21:16:11 +010084
Jose Fonsecac110dbc2017-06-23 13:04:17 +010085### Properties ###
86
87Properties are used to describe characteristics of the process, OS, hardware, etc.
88
89 properties = property+
90
91 property = property_name property_value
92 | empty_string // terminator
93 property_name = string
94 property_value = string
95
96
José Fonseca38ab5182014-05-23 21:16:11 +010097### Calls ###
98
99Calls consist of an enter and leave event pair. Calls are numbered from zero,
100and the call number is implied for the enter event.
101
102 event = 0x00 thread_no call_sig call_detail+ // enter call (version_no >= 4)
103 | 0x00 call_sig call_detail+ // enter call (version_no < 4)
104 | 0x01 call_no call_detail+ // leave call
105
106 call_sig = id function_name count arg_name* // first occurrence
107 | id // follow-on occurrences
108
109 call_detail = 0x00 // terminator
110 | 0x01 arg_no value // argument value
111 | 0x02 value // return value
112 | 0x03 thread_no // thread number (version_no < 4)
113 | 0x04 count frame* // stack backtrace
Jose Fonsecaaf0d45b2017-06-28 22:35:37 +0100114 | 0x05 uint // flag
José Fonseca38ab5182014-05-23 21:16:11 +0100115
116 arg_name = string
117 function_name = string
118
119 arg_no = uint
120 call_no = uint
121 thread_no = uint
122
123 id = uint
124
125### Values ###
126
127 value = 0x00 // null pointer
128 | 0x01 // false value
129 | 0x02 // true
130 | 0x03 uint // negative integer
131 | 0x04 uint // positive integer value
132 | 0x05 float // single-precision floating point value
133 | 0x06 double // double-precision floating point value
134 | 0x07 string // character string value (zero terminator implied)
135 | 0x08 string // binary blob
José Fonseca1ba7d252014-06-03 13:24:32 +0100136 | 0x09 enum_sig value // enumeration (version_no >= 3)
137 | 0x09 string value // enumeration (version_no < 3)
138 | 0x0a bitmask_sig value // integer bitmask
139 | 0x0b count value* // array
140 | 0x0c struct_sig value* // structure
141 | 0x0d uint // opaque pointer
142 | 0x0e value value // human-machine representation
José Fonsecad5cda7c2014-09-25 15:19:09 +0100143 | 0x0f wstring // wide character string value (zero terminator implied)
José Fonseca38ab5182014-05-23 21:16:11 +0100144
145 enum_sig = id count (name value)+ // first occurrence
146 | id // follow-on occurrences
147
Jose Fonsecab5ce0152016-10-05 22:32:47 +0100148 bitmask_sig = id count (name uint)+ // first occurrence
149 | id // follow-on occurrences
José Fonseca38ab5182014-05-23 21:16:11 +0100150
Jose Fonsecab5ce0152016-10-05 22:32:47 +0100151 struct_sig = id struct_name count member_name* // first occurrence
152 | id // follow-on occurrences
José Fonseca38ab5182014-05-23 21:16:11 +0100153
154 name = string
Jose Fonsecab5ce0152016-10-05 22:32:47 +0100155 struct_name = string
José Fonseca38ab5182014-05-23 21:16:11 +0100156 member_name = string
157
José Fonsecad5cda7c2014-09-25 15:19:09 +0100158 wstring = count uint*
159
José Fonseca38ab5182014-05-23 21:16:11 +0100160### Backtraces ###
161
162 frame = id frame_detail+ // first occurrence
163 | id // follow-on occurrences
164
165 frame_detail = 0x00 // terminator
166 | 0x01 string // module name
167 | 0x02 string // function name
168 | 0x03 string // source file name
169 | 0x04 uint // source line number
170 | 0x05 uint // byte offset from module start