1*6dbdd20aSAndroid Build Coastguard Worker /* 2*6dbdd20aSAndroid Build Coastguard Worker * Copyright (C) 2021 The Android Open Source Project 3*6dbdd20aSAndroid Build Coastguard Worker * 4*6dbdd20aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*6dbdd20aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*6dbdd20aSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*6dbdd20aSAndroid Build Coastguard Worker * 8*6dbdd20aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*6dbdd20aSAndroid Build Coastguard Worker * 10*6dbdd20aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*6dbdd20aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*6dbdd20aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*6dbdd20aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*6dbdd20aSAndroid Build Coastguard Worker * limitations under the License. 15*6dbdd20aSAndroid Build Coastguard Worker */ 16*6dbdd20aSAndroid Build Coastguard Worker 17*6dbdd20aSAndroid Build Coastguard Worker #ifndef SRC_PROFILING_SYMBOLIZER_BREAKPAD_PARSER_H_ 18*6dbdd20aSAndroid Build Coastguard Worker #define SRC_PROFILING_SYMBOLIZER_BREAKPAD_PARSER_H_ 19*6dbdd20aSAndroid Build Coastguard Worker 20*6dbdd20aSAndroid Build Coastguard Worker #include <optional> 21*6dbdd20aSAndroid Build Coastguard Worker #include <string> 22*6dbdd20aSAndroid Build Coastguard Worker #include <vector> 23*6dbdd20aSAndroid Build Coastguard Worker 24*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/base/status.h" 25*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/string_view.h" 26*6dbdd20aSAndroid Build Coastguard Worker 27*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto { 28*6dbdd20aSAndroid Build Coastguard Worker namespace profiling { 29*6dbdd20aSAndroid Build Coastguard Worker 30*6dbdd20aSAndroid Build Coastguard Worker // The BreakpadParser class is used to parse a breakpad file and store data on 31*6dbdd20aSAndroid Build Coastguard Worker // symbols so that a given address can be used to query a symbol. The class is 32*6dbdd20aSAndroid Build Coastguard Worker // instantiated with the |file_path| of the file to be parsed. Breakpad file 33*6dbdd20aSAndroid Build Coastguard Worker // format: 34*6dbdd20aSAndroid Build Coastguard Worker // https://chromium.googlesource.com/breakpad/breakpad/+/master/docs/symbol_files.md 35*6dbdd20aSAndroid Build Coastguard Worker // Usage: 36*6dbdd20aSAndroid Build Coastguard Worker // 37*6dbdd20aSAndroid Build Coastguard Worker // BreakpadParser parser("file.breakpad"); 38*6dbdd20aSAndroid Build Coastguard Worker // parser.ParseFile(); 39*6dbdd20aSAndroid Build Coastguard Worker // std::string symbol = parser.GetSymbol(addr); 40*6dbdd20aSAndroid Build Coastguard Worker class BreakpadParser { 41*6dbdd20aSAndroid Build Coastguard Worker public: 42*6dbdd20aSAndroid Build Coastguard Worker struct Symbol { 43*6dbdd20aSAndroid Build Coastguard Worker // The address where a function starts. 44*6dbdd20aSAndroid Build Coastguard Worker uint64_t start_address = 0; 45*6dbdd20aSAndroid Build Coastguard Worker // The length in bytes of the function's instructions. 46*6dbdd20aSAndroid Build Coastguard Worker size_t function_size = 0; 47*6dbdd20aSAndroid Build Coastguard Worker // The human-readable name for the function signature. 48*6dbdd20aSAndroid Build Coastguard Worker std::string symbol_name; 49*6dbdd20aSAndroid Build Coastguard Worker }; 50*6dbdd20aSAndroid Build Coastguard Worker 51*6dbdd20aSAndroid Build Coastguard Worker explicit BreakpadParser(const std::string& file_path); 52*6dbdd20aSAndroid Build Coastguard Worker 53*6dbdd20aSAndroid Build Coastguard Worker BreakpadParser(const BreakpadParser& other) = delete; 54*6dbdd20aSAndroid Build Coastguard Worker BreakpadParser& operator=(const BreakpadParser& other) = delete; 55*6dbdd20aSAndroid Build Coastguard Worker 56*6dbdd20aSAndroid Build Coastguard Worker // Fills in |symbols_| by parsing the breakpad file given. 57*6dbdd20aSAndroid Build Coastguard Worker // Returns true if it is able to parse the entire file specified by 58*6dbdd20aSAndroid Build Coastguard Worker // |file_path_|. Returns false if the parsing fails. 59*6dbdd20aSAndroid Build Coastguard Worker bool ParseFile(); 60*6dbdd20aSAndroid Build Coastguard Worker 61*6dbdd20aSAndroid Build Coastguard Worker // Parses from a string instead of a file. 62*6dbdd20aSAndroid Build Coastguard Worker bool ParseFromString(const std::string& file_contents); 63*6dbdd20aSAndroid Build Coastguard Worker 64*6dbdd20aSAndroid Build Coastguard Worker // Returns the function name corresponding to |address| as a string. The 65*6dbdd20aSAndroid Build Coastguard Worker // search is log(N) on the number of functions in the binary. |address| is the 66*6dbdd20aSAndroid Build Coastguard Worker // relative offset from the start of the binary. 67*6dbdd20aSAndroid Build Coastguard Worker std::optional<std::string> GetSymbol(uint64_t address) const; 68*6dbdd20aSAndroid Build Coastguard Worker symbols_for_testing()69*6dbdd20aSAndroid Build Coastguard Worker const std::vector<Symbol>& symbols_for_testing() const { return symbols_; } 70*6dbdd20aSAndroid Build Coastguard Worker 71*6dbdd20aSAndroid Build Coastguard Worker private: 72*6dbdd20aSAndroid Build Coastguard Worker // Parses the given string and creates a new Symbol object if it is a FUNC 73*6dbdd20aSAndroid Build Coastguard Worker // record. Returns an ok status if it was successfully able to add to the 74*6dbdd20aSAndroid Build Coastguard Worker // |symbols_| or if the string is not a FUNC record. Return a fail status on 75*6dbdd20aSAndroid Build Coastguard Worker // parsing errors on FUNC record. 76*6dbdd20aSAndroid Build Coastguard Worker base::Status ParseIfFuncRecord(base::StringView current_line); 77*6dbdd20aSAndroid Build Coastguard Worker 78*6dbdd20aSAndroid Build Coastguard Worker std::vector<Symbol> symbols_; 79*6dbdd20aSAndroid Build Coastguard Worker const std::string file_path_; 80*6dbdd20aSAndroid Build Coastguard Worker }; 81*6dbdd20aSAndroid Build Coastguard Worker 82*6dbdd20aSAndroid Build Coastguard Worker } // namespace profiling 83*6dbdd20aSAndroid Build Coastguard Worker } // namespace perfetto 84*6dbdd20aSAndroid Build Coastguard Worker 85*6dbdd20aSAndroid Build Coastguard Worker #endif // SRC_PROFILING_SYMBOLIZER_BREAKPAD_PARSER_H_ 86