Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 

213 rindas
8.6 KiB

  1. // Copyright 2016 Google Inc. All Rights Reserved.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. // Profile is a common stacktrace profile format.
  15. //
  16. // Measurements represented with this format should follow the
  17. // following conventions:
  18. //
  19. // - Consumers should treat unset optional fields as if they had been
  20. // set with their default value.
  21. //
  22. // - When possible, measurements should be stored in "unsampled" form
  23. // that is most useful to humans. There should be enough
  24. // information present to determine the original sampled values.
  25. //
  26. // - On-disk, the serialized proto must be gzip-compressed.
  27. //
  28. // - The profile is represented as a set of samples, where each sample
  29. // references a sequence of locations, and where each location belongs
  30. // to a mapping.
  31. // - There is a N->1 relationship from sample.location_id entries to
  32. // locations. For every sample.location_id entry there must be a
  33. // unique Location with that id.
  34. // - There is an optional N->1 relationship from locations to
  35. // mappings. For every nonzero Location.mapping_id there must be a
  36. // unique Mapping with that id.
  37. syntax = "proto3";
  38. package perftools.profiles;
  39. option java_package = "com.google.perftools.profiles";
  40. option java_outer_classname = "ProfileProto";
  41. message Profile {
  42. // A description of the samples associated with each Sample.value.
  43. // For a cpu profile this might be:
  44. // [["cpu","nanoseconds"]] or [["wall","seconds"]] or [["syscall","count"]]
  45. // For a heap profile, this might be:
  46. // [["allocations","count"], ["space","bytes"]],
  47. // If one of the values represents the number of events represented
  48. // by the sample, by convention it should be at index 0 and use
  49. // sample_type.unit == "count".
  50. repeated ValueType sample_type = 1;
  51. // The set of samples recorded in this profile.
  52. repeated Sample sample = 2;
  53. // Mapping from address ranges to the image/binary/library mapped
  54. // into that address range. mapping[0] will be the main binary.
  55. repeated Mapping mapping = 3;
  56. // Useful program location
  57. repeated Location location = 4;
  58. // Functions referenced by locations
  59. repeated Function function = 5;
  60. // A common table for strings referenced by various messages.
  61. // string_table[0] must always be "".
  62. repeated string string_table = 6;
  63. // frames with Function.function_name fully matching the following
  64. // regexp will be dropped from the samples, along with their successors.
  65. int64 drop_frames = 7; // Index into string table.
  66. // frames with Function.function_name fully matching the following
  67. // regexp will be kept, even if it matches drop_functions.
  68. int64 keep_frames = 8; // Index into string table.
  69. // The following fields are informational, do not affect
  70. // interpretation of results.
  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. // ValueType describes the semantics and measurement units of a value.
  87. message ValueType {
  88. int64 type = 1; // Index into string table.
  89. int64 unit = 2; // Index into string table.
  90. }
  91. // Each Sample records values encountered in some program
  92. // context. The program context is typically a stack trace, perhaps
  93. // augmented with auxiliary information like the thread-id, some
  94. // indicator of a higher level request being handled etc.
  95. message Sample {
  96. // The ids recorded here correspond to a Profile.location.id.
  97. // The leaf is at location_id[0].
  98. repeated uint64 location_id = 1;
  99. // The type and unit of each value is defined by the corresponding
  100. // entry in Profile.sample_type. All samples must have the same
  101. // number of values, the same as the length of Profile.sample_type.
  102. // When aggregating multiple samples into a single sample, the
  103. // result has a list of values that is the elemntwise sum of the
  104. // lists of the originals.
  105. repeated int64 value = 2;
  106. // label includes additional context for this sample. It can include
  107. // things like a thread id, allocation size, etc
  108. repeated Label label = 3;
  109. }
  110. message Label {
  111. int64 key = 1; // Index into string table
  112. // At most one of the following must be present
  113. int64 str = 2; // Index into string table
  114. int64 num = 3;
  115. // Should only be present when num is present.
  116. // Specifies the units of num.
  117. // Use arbitrary string (for example, "requests") as a custom count unit.
  118. // If no unit is specified, consumer may apply heuristic to deduce the unit.
  119. // Consumers may also interpret units like "bytes" and "kilobytes" as memory
  120. // units and units like "seconds" and "nanoseconds" as time units,
  121. // and apply appropriate unit conversions to these.
  122. int64 num_unit = 4; // Index into string table
  123. }
  124. message Mapping {
  125. // Unique nonzero id for the mapping.
  126. uint64 id = 1;
  127. // Address at which the binary (or DLL) is loaded into memory.
  128. uint64 memory_start = 2;
  129. // The limit of the address range occupied by this mapping.
  130. uint64 memory_limit = 3;
  131. // Offset in the binary that corresponds to the first mapped address.
  132. uint64 file_offset = 4;
  133. // The object this entry is loaded from. This can be a filename on
  134. // disk for the main binary and shared libraries, or virtual
  135. // abstractions like "[vdso]".
  136. int64 filename = 5; // Index into string table
  137. // A string that uniquely identifies a particular program version
  138. // with high probability. E.g., for binaries generated by GNU tools,
  139. // it could be the contents of the .note.gnu.build-id field.
  140. int64 build_id = 6; // Index into string table
  141. // The following fields indicate the resolution of symbolic info.
  142. bool has_functions = 7;
  143. bool has_filenames = 8;
  144. bool has_line_numbers = 9;
  145. bool has_inline_frames = 10;
  146. }
  147. // Describes function and line table debug information.
  148. message Location {
  149. // Unique nonzero id for the location. A profile could use
  150. // instruction addresses or any integer sequence as ids.
  151. uint64 id = 1;
  152. // The id of the corresponding profile.Mapping for this location.
  153. // It can be unset if the mapping is unknown or not applicable for
  154. // this profile type.
  155. uint64 mapping_id = 2;
  156. // The instruction address for this location, if available. It
  157. // should be within [Mapping.memory_start...Mapping.memory_limit]
  158. // for the corresponding mapping. A non-leaf address may be in the
  159. // middle of a call instruction. It is up to display tools to find
  160. // the beginning of the instruction if necessary.
  161. uint64 address = 3;
  162. // Multiple line indicates this location has inlined functions,
  163. // where the last entry represents the caller into which the
  164. // preceding entries were inlined.
  165. //
  166. // E.g., if memcpy() is inlined into printf:
  167. // line[0].function_name == "memcpy"
  168. // line[1].function_name == "printf"
  169. repeated Line line = 4;
  170. // Provides an indication that multiple symbols map to this location's
  171. // address, for example due to identical code folding by the linker. In that
  172. // case the line information above represents one of the multiple
  173. // symbols. This field must be recomputed when the symbolization state of the
  174. // profile changes.
  175. bool is_folded = 5;
  176. }
  177. message Line {
  178. // The id of the corresponding profile.Function for this line.
  179. uint64 function_id = 1;
  180. // Line number in source code.
  181. int64 line = 2;
  182. }
  183. message Function {
  184. // Unique nonzero id for the function.
  185. uint64 id = 1;
  186. // Name of the function, in human-readable form if available.
  187. int64 name = 2; // Index into string table
  188. // Name of the function, as identified by the system.
  189. // For instance, it can be a C++ mangled name.
  190. int64 system_name = 3; // Index into string table
  191. // Source file containing the function.
  192. int64 filename = 4; // Index into string table
  193. // Line number in source file.
  194. int64 start_line = 5;
  195. }