blob: 99b6efeb4e37d8869ecac525cdba6cf1c15c1898 [file] [log] [blame]
Raul Silvera0c3c35e2016-09-21 13:14:55 -07001// Copyright (c) 2016, Google Inc.
2// All rights reserved.
lannadorai2b536c92017-07-11 18:10:46 -07003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
Raul Silvera0c3c35e2016-09-21 13:14:55 -07005//
6////////////////////////////////////////////////////////////////////////////////
7
8// Profile is a common stacktrace profile format.
9//
10// Measurements represented with this format should follow the
11// following conventions:
12//
13// - Consumers should treat unset optional fields as if they had been
14// set with their default value.
15//
16// - When possible, measurements should be stored in "unsampled" form
17// that is most useful to humans. There should be enough
18// information present to determine the original sampled values.
19//
20// - On-disk, the serialized proto must be gzip-compressed.
21//
22// - The profile is represented as a set of samples, where each sample
23// references a sequence of locations, and where each location belongs
24// to a mapping.
25// - There is a N->1 relationship from sample.location_id entries to
26// locations. For every sample.location_id entry there must be a
27// unique Location with that id.
28// - There is an optional N->1 relationship from locations to
29// mappings. For every nonzero Location.mapping_id there must be a
30// unique Mapping with that id.
31
32syntax = "proto3";
33
34package perftools.profiles;
35
36option java_package = "com.google.perftools.profiles";
37option java_outer_classname = "ProfileProto";
38
39message Profile {
40 // A description of the samples associated with each Sample.value.
41 // For a cpu profile this might be:
42 // [["cpu","nanoseconds"]] or [["wall","seconds"]] or [["syscall","count"]]
43 // For a heap profile, this might be:
44 // [["allocations","count"], ["space","bytes"]],
45 // If one of the values represents the number of events represented
46 // by the sample, by convention it should be at index 0 and use
47 // sample_type.unit == "count".
48 repeated ValueType sample_type = 1;
49 // The set of samples recorded in this profile.
50 repeated Sample sample = 2;
51 // Mapping from address ranges to the image/binary/library mapped
52 // into that address range. mapping[0] will be the main binary.
53 repeated Mapping mapping = 3;
54 // Useful program location
55 repeated Location location = 4;
56 // Functions referenced by locations
57 repeated Function function = 5;
58 // A common table for strings referenced by various messages.
59 // string_table[0] must always be "".
60 repeated string string_table = 6;
61 // frames with Function.function_name fully matching the following
62 // regexp will be dropped from the samples, along with their successors.
63 int64 drop_frames = 7; // Index into string table.
64 // frames with Function.function_name fully matching the following
65 // regexp will be kept, even if it matches drop_functions.
66 int64 keep_frames = 8; // Index into string table.
67
68 // The following fields are informational, do not affect
69 // interpretation of results.
70
71 // Time of collection (UTC) represented as nanoseconds past the epoch.
72 int64 time_nanos = 9;
73 // Duration of the profile, if a duration makes sense.
74 int64 duration_nanos = 10;
75 // The kind of events between sampled ocurrences.
76 // e.g [ "cpu","cycles" ] or [ "heap","bytes" ]
77 ValueType period_type = 11;
78 // The number of events between sampled occurrences.
79 int64 period = 12;
80 // Freeform text associated to the profile.
81 repeated int64 comment = 13; // Indices into string table.
82 // Index into the string table of the type of the preferred sample
83 // value. If unset, clients should default to the last sample value.
84 int64 default_sample_type = 14;
85}
86
87// ValueType describes the semantics and measurement units of a value.
88message ValueType {
89 int64 type = 1; // Index into string table.
90 int64 unit = 2; // Index into string table.
91}
92
93// Each Sample records values encountered in some program
94// context. The program context is typically a stack trace, perhaps
95// augmented with auxiliary information like the thread-id, some
96// indicator of a higher level request being handled etc.
97message Sample {
98 // The ids recorded here correspond to a Profile.location.id.
99 // The leaf is at location_id[0].
100 repeated uint64 location_id = 1;
101 // The type and unit of each value is defined by the corresponding
102 // entry in Profile.sample_type. All samples must have the same
103 // number of values, the same as the length of Profile.sample_type.
104 // When aggregating multiple samples into a single sample, the
105 // result has a list of values that is the elemntwise sum of the
106 // lists of the originals.
107 repeated int64 value = 2;
108 // label includes additional context for this sample. It can include
109 // things like a thread id, allocation size, etc
110 repeated Label label = 3;
111}
112
113message Label {
114 int64 key = 1; // Index into string table
115
116 // At most one of the following must be present
117 int64 str = 2; // Index into string table
118 int64 num = 3;
119}
120
121message Mapping {
122 // Unique nonzero id for the mapping.
123 uint64 id = 1;
124 // Address at which the binary (or DLL) is loaded into memory.
125 uint64 memory_start = 2;
126 // The limit of the address range occupied by this mapping.
127 uint64 memory_limit = 3;
128 // Offset in the binary that corresponds to the first mapped address.
129 uint64 file_offset = 4;
130 // The object this entry is loaded from. This can be a filename on
131 // disk for the main binary and shared libraries, or virtual
132 // abstractions like "[vdso]".
133 int64 filename = 5; // Index into string table
134 // A string that uniquely identifies a particular program version
135 // with high probability. E.g., for binaries generated by GNU tools,
136 // it could be the contents of the .note.gnu.build-id field.
137 int64 build_id = 6; // Index into string table
138
139 // The following fields indicate the resolution of symbolic info.
140 bool has_functions = 7;
141 bool has_filenames = 8;
142 bool has_line_numbers = 9;
143 bool has_inline_frames = 10;
144}
145
146// Describes function and line table debug information.
147message Location {
148 // Unique nonzero id for the location. A profile could use
149 // instruction addresses or any integer sequence as ids.
150 uint64 id = 1;
151 // The id of the corresponding profile.Mapping for this location.
152 // If can be unset if the mapping is unknown or not applicable for
153 // this profile type.
154 uint64 mapping_id = 2;
155 // The instruction address for this location, if available. It
156 // should be within [Mapping.memory_start...Mapping.memory_limit]
157 // for the corresponding mapping. A non-leaf address may be in the
158 // middle of a call instruction. It is up to display tools to find
159 // the beginning of the instruction if necessary.
160 uint64 address = 3;
161 // Multiple line indicates this location has inlined functions,
162 // where the last entry represents the caller into which the
163 // preceding entries were inlined.
164 //
165 // E.g., if memcpy() is inlined into printf:
166 // line[0].function_name == "memcpy"
167 // line[1].function_name == "printf"
168 repeated Line line = 4;
169}
170
171message Line {
172 // The id of the corresponding profile.Function for this line.
173 uint64 function_id = 1;
174 // Line number in source code.
175 int64 line = 2;
176}
177
178message Function {
179 // Unique nonzero id for the function.
180 uint64 id = 1;
181 // Name of the function, in human-readable form if available.
182 int64 name = 2; // Index into string table
183 // Name of the function, as identified by the system.
184 // For instance, it can be a C++ mangled name.
185 int64 system_name = 3; // Index into string table
186 // Source file containing the function.
187 int64 filename = 4; // Index into string table
188 // Line number in source file.
189 int64 start_line = 5;
190}