| /* |
| * 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<int> constructor, which gets inlined at 0xf00. We then get |
| // both Foo and the std::vector<int> 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<int> constructor, which gets inlined at 0xf00. We then get |
| // both Foo and the std::vector<int> 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; |
| } |