OSDN Git Service

Simpleperf: fix the process of parsing records.
authorYabin Cui <yabinc@google.com>
Mon, 3 Aug 2015 18:01:22 +0000 (11:01 -0700)
committerYabin Cui <yabinc@google.com>
Mon, 3 Aug 2015 18:06:25 +0000 (11:06 -0700)
It is not correct to parse all the mmap records first, then parse
all the sample records. Instead, records should be parsed one by one.
This change also fix the bug of not writing kernel build id in
record command, which is introduced previously.

Change-Id: I7e6d3d1c74c134e4b7af97c184b6a71c3379a59a

simpleperf/cmd_record.cpp
simpleperf/cmd_report.cpp
simpleperf/thread_tree.cpp
simpleperf/thread_tree.h

index e4f1d41..f952cee 100644 (file)
@@ -549,7 +549,7 @@ bool RecordCommand::DumpBuildIdFeature() {
   BuildId build_id;
   // Add build_ids for kernel/modules.
   for (auto& filename : kernel_modules) {
-    if (filename == DEFAULT_KERNEL_MMAP_NAME) {
+    if (filename == DEFAULT_KERNEL_FILENAME_FOR_BUILD_ID) {
       if (!GetKernelBuildId(&build_id)) {
         LOG(DEBUG) << "can't read build_id for kernel";
         continue;
@@ -593,8 +593,8 @@ bool RecordCommand::GetHitFiles(std::set<std::string>* kernel_modules,
     return false;
   }
   ThreadTree thread_tree;
-  BuildThreadTree(records, &thread_tree);
   for (auto& record : records) {
+    BuildThreadTree(*record, &thread_tree);
     if (record->header.type == PERF_RECORD_SAMPLE) {
       auto r = *static_cast<const SampleRecord*>(record.get());
       bool in_kernel = ((r.header.misc & PERF_RECORD_MISC_CPUMODE_MASK) == PERF_RECORD_MISC_KERNEL);
index c92aa65..195ed37 100644 (file)
@@ -450,8 +450,8 @@ bool ReportCommand::ReadEventAttrFromRecordFile() {
 void ReportCommand::ReadSampleTreeFromRecordFile() {
   std::vector<std::unique_ptr<Record>> records = record_file_reader_->DataSection();
   thread_tree_.AddThread(0, 0, "swapper");
-  BuildThreadTree(records, &thread_tree_);
   for (auto& record : records) {
+    BuildThreadTree(*record, &thread_tree_);
     if (record->header.type == PERF_RECORD_SAMPLE) {
       ProcessSampleRecord(*static_cast<const SampleRecord*>(record.get()));
     }
index 937dfcf..9407733 100644 (file)
@@ -182,34 +182,32 @@ const SymbolEntry* ThreadTree::FindSymbol(const MapEntry* map, uint64_t ip) {
   return symbol;
 }
 
-void BuildThreadTree(const std::vector<std::unique_ptr<Record>>& records, ThreadTree* thread_tree) {
-  for (auto& record : records) {
-    if (record->header.type == PERF_RECORD_MMAP) {
-      const MmapRecord& r = *static_cast<const MmapRecord*>(record.get());
-      if ((r.header.misc & PERF_RECORD_MISC_CPUMODE_MASK) == PERF_RECORD_MISC_KERNEL) {
-        thread_tree->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,
-                                  r.sample_id.time_data.time, r.filename);
-      }
-    } else if (record->header.type == PERF_RECORD_MMAP2) {
-      const Mmap2Record& r = *static_cast<const Mmap2Record*>(record.get());
-      if ((r.header.misc & PERF_RECORD_MISC_CPUMODE_MASK) == PERF_RECORD_MISC_KERNEL) {
-        thread_tree->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,
-                                  r.sample_id.time_data.time, filename);
-      }
-    } else if (record->header.type == PERF_RECORD_COMM) {
-      const CommRecord& r = *static_cast<const CommRecord*>(record.get());
-      thread_tree->AddThread(r.data.pid, r.data.tid, r.comm);
-    } else if (record->header.type == PERF_RECORD_FORK) {
-      const ForkRecord& r = *static_cast<const ForkRecord*>(record.get());
-      thread_tree->ForkThread(r.data.pid, r.data.tid, r.data.ppid, r.data.ptid);
+void BuildThreadTree(const Record& record, ThreadTree* thread_tree) {
+  if (record.header.type == PERF_RECORD_MMAP) {
+    const MmapRecord& r = *static_cast<const MmapRecord*>(&record);
+    if ((r.header.misc & PERF_RECORD_MISC_CPUMODE_MASK) == PERF_RECORD_MISC_KERNEL) {
+      thread_tree->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,
+                                r.sample_id.time_data.time, r.filename);
+    }
+  } else if (record.header.type == PERF_RECORD_MMAP2) {
+    const Mmap2Record& r = *static_cast<const Mmap2Record*>(&record);
+    if ((r.header.misc & PERF_RECORD_MISC_CPUMODE_MASK) == PERF_RECORD_MISC_KERNEL) {
+      thread_tree->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,
+                                r.sample_id.time_data.time, filename);
     }
+  } else if (record.header.type == PERF_RECORD_COMM) {
+    const CommRecord& r = *static_cast<const CommRecord*>(&record);
+    thread_tree->AddThread(r.data.pid, r.data.tid, r.comm);
+  } else if (record.header.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);
   }
 }
index 9388c8d..ea52f97 100644 (file)
@@ -91,6 +91,6 @@ class ThreadTree {
 
 struct Record;
 
-void BuildThreadTree(const std::vector<std::unique_ptr<Record>>& records, ThreadTree* thread_tree);
+void BuildThreadTree(const Record& record, ThreadTree* thread_tree);
 
 #endif  // SIMPLE_PERF_THREAD_TREE_H_