OSDN Git Service

simplperf: improve unknown symbol print in report-sample command.
authorYabin Cui <yabinc@google.com>
Thu, 21 Jul 2016 19:29:47 +0000 (12:29 -0700)
committerYabin Cui <yabinc@google.com>
Thu, 21 Jul 2016 19:31:35 +0000 (12:31 -0700)
Add * for all unknown symbols, so it is easier to write program to
identify unknown symbols.
Use dso[+ip_offset] for unknown symbols.

Bug: 28114205
Change-Id: I14cfffe6673a9aedc62cc288c1b2d724ab411f5d

simpleperf/cmd_report_sample.cpp
simpleperf/thread_tree.cpp
simpleperf/thread_tree.h

index 9c407d3..e27fa99 100644 (file)
@@ -78,7 +78,10 @@ class ReportSampleCommand : public Command {
         use_protobuf_(false),
         report_fp_(nullptr),
         coded_os_(nullptr),
-        sample_count_(0) {}
+        sample_count_(0) {
+    thread_tree_.ShowMarkForUnknownSymbol();
+    thread_tree_.ShowIpForUnknownSymbol();
+  }
 
   bool Run(const std::vector<std::string>& args) override;
 
index fafefa0..3a20ee7 100644 (file)
@@ -228,7 +228,9 @@ const Symbol* ThreadTree::FindSymbol(const MapEntry* map, uint64_t ip,
   if (symbol == nullptr) {
     if (show_ip_for_unknown_symbol_) {
       std::string name = android::base::StringPrintf(
-          "%s[+%" PRIx64 "]", dso->FileName().c_str(), vaddr_in_file);
+          "%s%s[+%" PRIx64 "]",
+          (show_mark_for_unknown_symbol_ ? "*" : ""),
+          dso->FileName().c_str(), vaddr_in_file);
       dso->InsertSymbol(Symbol(name, vaddr_in_file, 1));
       symbol = dso->FindSymbol(vaddr_in_file);
       CHECK(symbol != nullptr);
index a8d3fa0..5498df5 100644 (file)
@@ -69,6 +69,7 @@ class ThreadTree {
  public:
   ThreadTree()
       : show_ip_for_unknown_symbol_(false),
+        show_mark_for_unknown_symbol_(false),
         unknown_symbol_("unknown", 0,
                         std::numeric_limits<unsigned long long>::max()) {
     unknown_dso_ = Dso::CreateDso(DSO_ELF_FILE, "unknown");
@@ -94,6 +95,10 @@ class ThreadTree {
   const Symbol* UnknownSymbol() const { return &unknown_symbol_; }
 
   void ShowIpForUnknownSymbol() { show_ip_for_unknown_symbol_ = true; }
+  void ShowMarkForUnknownSymbol() {
+    show_mark_for_unknown_symbol_ = true;
+    unknown_symbol_ = Symbol("*unknown", 0, ULLONG_MAX);
+  }
   // Clear thread and map information, but keep loaded dso information. It saves
   // the time to reload dso information.
   void ClearThreadAndMap();
@@ -120,6 +125,7 @@ class ThreadTree {
   std::unordered_map<std::string, std::unique_ptr<Dso>> user_dso_tree_;
   std::unique_ptr<Dso> unknown_dso_;
   bool show_ip_for_unknown_symbol_;
+  bool show_mark_for_unknown_symbol_;
   Symbol unknown_symbol_;
   std::unordered_map<uint64_t, Dso*> dso_id_to_dso_map_;
 };