diff options
author | Yabin Cui <yabinc@google.com> | 2016-06-02 21:02:43 -0700 |
---|---|---|
committer | Yabin Cui <yabinc@google.com> | 2016-06-02 21:20:59 -0700 |
commit | 767dd17947f1ae9dd3d02f738d442a23ed76f2f6 (patch) | |
tree | 7a12bf5f77f3ee5c732a4bbe5eb3bf2539df56b5 /simpleperf/thread_tree.cpp | |
parent | d9aa9de34638e46de141584bad9daf71c07ab678 (diff) | |
download | extras-767dd17947f1ae9dd3d02f738d442a23ed76f2f6.tar.gz |
simpleperf: add report-sample command.
1. Add report-sample command to report each sample with symbol information.
2. Add --dump-symbols option to record command to collect dso and symbol
information in perf.data.
Bug: 28114205
Change-Id: I37424ee6abd74a21ad41cd3b6c4249cf0625c201
Diffstat (limited to 'simpleperf/thread_tree.cpp')
-rw-r--r-- | simpleperf/thread_tree.cpp | 38 |
1 files changed, 25 insertions, 13 deletions
diff --git a/simpleperf/thread_tree.cpp b/simpleperf/thread_tree.cpp index 70ed739e..42104f39 100644 --- a/simpleperf/thread_tree.cpp +++ b/simpleperf/thread_tree.cpp @@ -212,45 +212,40 @@ const Symbol* ThreadTree::FindSymbol(const MapEntry* map, uint64_t ip) { return symbol; } -void ThreadTree::Clear() { +void ThreadTree::ClearThreadAndMap() { thread_tree_.clear(); thread_comm_storage_.clear(); kernel_map_tree_.clear(); map_storage_.clear(); - kernel_dso_.reset(); - module_dso_tree_.clear(); - user_dso_tree_.clear(); } -} // namespace simpleperf - -void BuildThreadTree(const Record& record, ThreadTree* thread_tree) { +void ThreadTree::Update(const Record& record) { if (record.type() == PERF_RECORD_MMAP) { const MmapRecord& r = *static_cast<const MmapRecord*>(&record); if (r.InKernel()) { - thread_tree->AddKernelMap(r.data.addr, r.data.len, r.data.pgoff, r.sample_id.time_data.time, + AddKernelMap(r.data.addr, r.data.len, r.data.pgoff, r.sample_id.time_data.time, r.filename); } else { - thread_tree->AddThreadMap(r.data.pid, r.data.tid, r.data.addr, r.data.len, r.data.pgoff, + AddThreadMap(r.data.pid, r.data.tid, r.data.addr, r.data.len, r.data.pgoff, r.sample_id.time_data.time, r.filename); } } else if (record.type() == PERF_RECORD_MMAP2) { const Mmap2Record& r = *static_cast<const Mmap2Record*>(&record); if (r.InKernel()) { - thread_tree->AddKernelMap(r.data.addr, r.data.len, r.data.pgoff, r.sample_id.time_data.time, + AddKernelMap(r.data.addr, r.data.len, r.data.pgoff, r.sample_id.time_data.time, r.filename); } else { std::string filename = (r.filename == DEFAULT_EXECNAME_FOR_THREAD_MMAP) ? "[unknown]" : r.filename; - thread_tree->AddThreadMap(r.data.pid, r.data.tid, r.data.addr, r.data.len, r.data.pgoff, + AddThreadMap(r.data.pid, r.data.tid, r.data.addr, r.data.len, r.data.pgoff, r.sample_id.time_data.time, filename); } } else if (record.type() == PERF_RECORD_COMM) { const CommRecord& r = *static_cast<const CommRecord*>(&record); - thread_tree->AddThread(r.data.pid, r.data.tid, r.comm); + AddThread(r.data.pid, r.data.tid, r.comm); } else if (record.type() == PERF_RECORD_FORK) { const ForkRecord& r = *static_cast<const ForkRecord*>(&record); - thread_tree->ForkThread(r.data.pid, r.data.tid, r.data.ppid, r.data.ptid); + ForkThread(r.data.pid, r.data.tid, r.data.ppid, r.data.ptid); } else if (record.type() == SIMPLE_PERF_RECORD_KERNEL_SYMBOL) { const auto& r = *static_cast<const KernelSymbolRecord*>(&record); static std::string kallsyms; @@ -259,5 +254,22 @@ void BuildThreadTree(const Record& record, ThreadTree* thread_tree) { Dso::SetKallsyms(std::move(kallsyms)); kallsyms.clear(); } + } else if (record.type() == SIMPLE_PERF_RECORD_DSO) { + auto& r = *static_cast<const DsoRecord*>(&record); + Dso* dso = nullptr; + if (r.dso_type == DSO_KERNEL || r.dso_type == DSO_KERNEL_MODULE) { + dso = FindKernelDsoOrNew(r.dso_name); + } else { + dso = FindUserDsoOrNew(r.dso_name); + } + dso_id_to_dso_map_[r.dso_id] = dso; + } else if (record.type() == SIMPLE_PERF_RECORD_SYMBOL) { + auto& r = *static_cast<const SymbolRecord*>(&record); + Dso* dso = dso_id_to_dso_map_[r.dso_id]; + CHECK(dso != nullptr); + dso->InsertSymbol(Symbol(r.name, r.addr, r.len)); } } + +} // namespace simpleperf + |