/* * Copyright (C) 2019 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"; package perfetto.protos; // TODO(fmayer): Figure out naming thoroughout this file to get a // nomenclature that works between Windows and Linux. // The interning fields in this file can refer to 2 different intern tables, // depending on the message they are used in. If the interned fields are present // in ProfilePacket proto, then the intern tables included in the ProfilePacket // should be used. If the intered fields are present in the // StreamingProfilePacket proto, then the intern tables included in all of the // previous InternedData message with same sequence ID should be used. // TODO(fmayer): Move to the intern tables to a common location. message InternedString { optional uint64 iid = 1; optional bytes str = 2; } // A symbol field that is emitted after the trace is written. These tables would // be appended as the last packets in the trace that the profiler will use, so // that the actual trace need not be rewritten to symbolize the profiles. message ProfiledFrameSymbols { // Use the frame id as the interning key for the symbols. optional uint64 frame_iid = 1; // These are repeated because when inlining happens, multiple functions' // frames can be at a single address. Imagine function Foo calling the // std::vector constructor, which gets inlined at 0xf00. We then get // both Foo and the std::vector constructor when we symbolize the // address. // key to InternedString repeated uint64 function_name_id = 2; // key to InternedString repeated uint64 file_name_id = 3; repeated uint32 line_number = 4; } message Line { optional string function_name = 1; optional string source_file_name = 2; optional uint32 line_number = 3; } // Symbols for a given address in a module. message AddressSymbols { optional uint64 address = 1; // Source lines that correspond to this address. // // These are repeated because when inlining happens, multiple functions' // frames can be at a single address. Imagine function Foo calling the // std::vector constructor, which gets inlined at 0xf00. We then get // both Foo and the std::vector constructor when we symbolize the // address. repeated Line lines = 2; } // Symbols for addresses seen in a module. message ModuleSymbols { // Fully qualified path to the mapping. // E.g. /system/lib64/libc.so. optional string path = 1; // .note.gnu.build-id on Linux (not hex encoded). // uuid on MacOS. // Module GUID on Windows. optional string build_id = 2; repeated AddressSymbols address_symbols = 3; } message Mapping { // Interning key. optional uint64 iid = 1; // Interning key. optional uint64 build_id = 2; // The linker may create multiple memory mappings for the same shared // library. // This is so that the ELF header is mapped as read only, while the // executable memory is mapped as executable only. // The details of this depend on the linker, a possible mapping of an ELF // file is this: // +----------------------+ // ELF |xxxxxxxxxyyyyyyyyyyyyy| // +---------+------------+ // | | // | read | executable // v mapping v mapping // +----------------------+ // Memory |xxxxxxxxx|yyyyyyyyyyyy| // +------------------+---+ // ^ ^ ^ // + + + // start exact relpc // offset offset 0x1800 // 0x0000 0x1000 // // exact_offset is the offset into the library file of this mapping. // start_offset is the offset into the library file of the first mapping // for that library. For native libraries (.so files) this should be 0. // This is not set on Android 10. optional uint64 exact_offset = 8; optional uint64 start_offset = 3; optional uint64 start = 4; optional uint64 end = 5; optional uint64 load_bias = 6; // E.g. ["system", "lib64", "libc.so"] // id of string. repeated uint64 path_string_ids = 7; } message Frame { // Interning key optional uint64 iid = 1; // E.g. "fopen" // id of string. optional uint64 function_name_id = 2; optional uint64 mapping_id = 3; optional uint64 rel_pc = 4; } message Callstack { optional uint64 iid = 1; // Frames of this callstack. Bottom frame first. repeated uint64 frame_ids = 2; }