blob: 4be89b1e7320d9041124fbf59edad5f154fac9a1 [file] [log] [blame]
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
syntax = "proto2";
option optimize_for = LITE_RUNTIME;
package perfetto.protos;
message ProfilePacket {
// either a function or library name.
repeated InternedString strings = 1;
message InternedString {
optional uint64 id = 1;
optional bytes str = 2;
}
repeated Frame frames = 2;
message Frame {
optional uint64 id = 1; // Interning key
// E.g. "fopen"
optional uint64 function_name_id = 2; // id of string.
optional uint64 mapping_id = 3;
optional uint64 rel_pc = 4;
}
repeated Callstack callstacks = 3;
message Callstack {
optional uint64 id = 1;
// Frames of this callstack. Bottom frame first.
repeated uint64 frame_ids = 2;
}
repeated Mapping mappings = 4;
message Mapping {
optional uint64 id = 1; // Interning key.
optional uint64 build_id = 2; // Interning key.
optional uint64 offset = 3;
optional uint64 start = 4;
optional uint64 end = 5;
optional uint64 load_bias = 6;
// E.g. ["system", "lib64", "libc.so"]
repeated uint64 path_string_ids = 7; // id of string.
}
message HeapSample {
optional uint64 callstack_id = 1;
// bytes allocated at this frame.
optional uint64 self_allocated = 2;
// bytes freed at this frame.
optional uint64 self_freed = 3;
optional uint64 timestamp = 4; // timestamp [opt]
optional uint64 alloc_count = 5;
optional uint64 free_count = 6;
}
repeated ProcessHeapSamples process_dumps = 5;
message Histogram {
message Bucket {
// This bucket counts values from the previous bucket's (or -infinity if
// this is the first bucket) upper_limit (inclusive) to this upper_limit
// (exclusive).
optional uint64 upper_limit = 1;
// This is the highest bucket. This is set instead of the upper_limit. Any
// values larger or equal to the previous bucket's upper_limit are counted
// in this bucket.
optional bool max_bucket = 2;
// Number of values that fall into this range.
optional uint64 count = 3;
}
repeated Bucket buckets = 1;
}
message ProcessStats {
optional uint64 unwinding_errors = 1;
optional uint64 heap_samples = 2;
optional uint64 map_reparses = 3;
optional Histogram unwinding_time_us = 4;
optional uint64 total_unwinding_time_us = 5;
}
message ProcessHeapSamples {
optional uint64 pid = 1;
// This process was profiled from startup.
// If false, this process was already running when profiling started.
optional bool from_startup = 3;
// This process was not profiled because a concurrent session was active.
// If this is true, samples will be empty.
optional bool rejected_concurrent = 4;
// This process disconnected while it was profiled.
// If false, the process outlived the profiling session.
optional bool disconnected = 6;
optional ProcessStats stats = 5;
repeated HeapSample samples = 2;
}
optional bool continued = 6;
optional uint64 index = 7;
}