diff options
author | Yabin Cui <yabinc@google.com> | 2017-03-16 13:00:43 -0700 |
---|---|---|
committer | Yabin Cui <yabinc@google.com> | 2017-03-17 18:36:23 -0700 |
commit | 129b5d2f72fbee901a504d328da5a9037b03a7b6 (patch) | |
tree | 187b6514e605bee21b61733b3ddd3c336a2c2277 /simpleperf/report_lib_interface.cpp | |
parent | 5b88b5289af87196d46f71b96817e8f9edd5dc35 (diff) | |
download | extras-129b5d2f72fbee901a504d328da5a9037b03a7b6.tar.gz |
simpleperf: add script to generate proto data used by pprof.
Also change Addr2Line to support inline functions.
Bug: http://b/35726123
Test: run gen_pprof_proto.py manually.
Change-Id: Ia2f84ac142e7075ea902f3456235db24567e4fcd
Diffstat (limited to 'simpleperf/report_lib_interface.cpp')
-rw-r--r-- | simpleperf/report_lib_interface.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/simpleperf/report_lib_interface.cpp b/simpleperf/report_lib_interface.cpp index cc793074..0d4380f6 100644 --- a/simpleperf/report_lib_interface.cpp +++ b/simpleperf/report_lib_interface.cpp @@ -47,11 +47,18 @@ struct Event { const char* name; }; +struct Mapping { + uint64_t start; + uint64_t end; + uint64_t pgoff; +}; + struct SymbolEntry { const char* dso_name; uint64_t vaddr_in_file; const char* symbol_name; uint64_t symbol_addr; + Mapping* mapping; }; struct CallChainEntry { @@ -130,6 +137,7 @@ class ReportLib { private: Sample* GetCurrentSample(); bool OpenRecordFileIfNecessary(); + Mapping* AddMapping(const MapEntry& map); std::unique_ptr<android::base::ScopedLogSeverity> log_severity_; std::string record_filename_; @@ -141,6 +149,7 @@ class ReportLib { Event current_event_; SymbolEntry current_symbol_; CallChain current_callchain_; + std::vector<std::unique_ptr<Mapping>> current_mappings_; std::vector<CallChainEntry> callchain_entries_; std::string build_id_string_; int update_flag_; @@ -198,6 +207,7 @@ Sample* ReportLib::GetNextSample() { } } update_flag_ = 0; + current_mappings_.clear(); return GetCurrentSample(); } @@ -250,6 +260,7 @@ SymbolEntry* ReportLib::GetSymbolOfCurrentSample() { current_symbol_.vaddr_in_file = vaddr_in_file; current_symbol_.symbol_name = symbol->DemangledName(); current_symbol_.symbol_addr = symbol->addr; + current_symbol_.mapping = AddMapping(*map); update_flag_ |= UPDATE_FLAG_OF_SYMBOL; } return ¤t_symbol_; @@ -296,6 +307,7 @@ CallChain* ReportLib::GetCallChainOfCurrentSample() { entry.symbol.vaddr_in_file = vaddr_in_file; entry.symbol.symbol_name = symbol->DemangledName(); entry.symbol.symbol_addr = symbol->addr; + entry.symbol.mapping = AddMapping(*map); callchain_entries_.push_back(entry); } } @@ -307,6 +319,15 @@ CallChain* ReportLib::GetCallChainOfCurrentSample() { return ¤t_callchain_; } +Mapping* ReportLib::AddMapping(const MapEntry& map) { + current_mappings_.emplace_back(std::unique_ptr<Mapping>(new Mapping)); + Mapping* mapping = current_mappings_.back().get(); + mapping->start = map.start_addr; + mapping->end = map.start_addr + map.len; + mapping->pgoff = map.pgoff; + return mapping; +} + const char* ReportLib::GetBuildIdForPath(const char* path) { if (!OpenRecordFileIfNecessary()) { build_id_string_.clear(); |