blob: 5c7fd2537ef688b4508b17fc8da16e4ccf908786 [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 Fonsecac110dbc2017-06-23 13:04:17 +010049| 6 | unicode strings; semantic version; properties |
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
114
115 arg_name = string
116 function_name = string
117
118 arg_no = uint
119 call_no = uint
120 thread_no = uint
121
122 id = uint
123
124### Values ###
125
126 value = 0x00 // null pointer
127 | 0x01 // false value
128 | 0x02 // true
129 | 0x03 uint // negative integer
130 | 0x04 uint // positive integer value
131 | 0x05 float // single-precision floating point value
132 | 0x06 double // double-precision floating point value
133 | 0x07 string // character string value (zero terminator implied)
134 | 0x08 string // binary blob
José Fonseca1ba7d252014-06-03 13:24:32 +0100135 | 0x09 enum_sig value // enumeration (version_no >= 3)
136 | 0x09 string value // enumeration (version_no < 3)
137 | 0x0a bitmask_sig value // integer bitmask
138 | 0x0b count value* // array
139 | 0x0c struct_sig value* // structure
140 | 0x0d uint // opaque pointer
141 | 0x0e value value // human-machine representation
José Fonsecad5cda7c2014-09-25 15:19:09 +0100142 | 0x0f wstring // wide character string value (zero terminator implied)
José Fonseca38ab5182014-05-23 21:16:11 +0100143
144 enum_sig = id count (name value)+ // first occurrence
145 | id // follow-on occurrences
146
Jose Fonsecab5ce0152016-10-05 22:32:47 +0100147 bitmask_sig = id count (name uint)+ // first occurrence
148 | id // follow-on occurrences
José Fonseca38ab5182014-05-23 21:16:11 +0100149
Jose Fonsecab5ce0152016-10-05 22:32:47 +0100150 struct_sig = id struct_name count member_name* // first occurrence
151 | id // follow-on occurrences
José Fonseca38ab5182014-05-23 21:16:11 +0100152
153 name = string
Jose Fonsecab5ce0152016-10-05 22:32:47 +0100154 struct_name = string
José Fonseca38ab5182014-05-23 21:16:11 +0100155 member_name = string
156
José Fonsecad5cda7c2014-09-25 15:19:09 +0100157 wstring = count uint*
158
José Fonseca38ab5182014-05-23 21:16:11 +0100159### Backtraces ###
160
161 frame = id frame_detail+ // first occurrence
162 | id // follow-on occurrences
163
164 frame_detail = 0x00 // terminator
165 | 0x01 string // module name
166 | 0x02 string // function name
167 | 0x03 string // source file name
168 | 0x04 uint // source line number
169 | 0x05 uint // byte offset from module start