summaryrefslogtreecommitdiff
path: root/simpleperf/thread_tree.cpp
diff options
context:
space:
mode:
authorYabin Cui <yabinc@google.com>2016-06-02 21:02:43 -0700
committerYabin Cui <yabinc@google.com>2016-06-02 21:20:59 -0700
commit767dd17947f1ae9dd3d02f738d442a23ed76f2f6 (patch)
tree7a12bf5f77f3ee5c732a4bbe5eb3bf2539df56b5 /simpleperf/thread_tree.cpp
parentd9aa9de34638e46de141584bad9daf71c07ab678 (diff)
downloadextras-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.cpp38
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
+