Fix bug when finding symbols for shared libraries
authorTeng Qin <qinteng@fb.com>
Wed, 10 May 2017 22:16:42 +0000 (15:16 -0700)
committerTeng Qin <qinteng@fb.com>
Thu, 11 May 2017 23:09:45 +0000 (16:09 -0700)
src/cc/bcc_syms.cc
src/cc/syms.h

index 82cfa37335ef917f5e9a8a41e88588aef889456c..4597ccf60f55879ec9599f95b9b481004ffa1194 100644 (file)
@@ -201,9 +201,10 @@ bool ProcSyms::resolve_addr(uint64_t addr, struct bcc_symbol *sym,
   sym->offset = 0x0;
 
   const char *original_module = nullptr;
+  uint64_t offset;
   for (Module &mod : modules_) {
-    if (mod.contains(addr)) {
-      bool res = mod.find_addr(addr, sym);
+    if (mod.contains(addr, offset)) {
+      bool res = mod.find_addr(offset, sym);
       if (demangle) {
         if (sym->name)
           sym->demangle_name =
@@ -295,11 +296,12 @@ void ProcSyms::Module::load_sym_table() {
   std::sort(syms_.begin(), syms_.end());
 }
 
-bool ProcSyms::Module::contains(uint64_t addr) const {
-  for (const auto &range : ranges_) {
-    if (addr >= range.start && addr < range.end)
+bool ProcSyms::Module::contains(uint64_t addr, uint64_t &offset) const {
+  for (const auto &range : ranges_)
+    if (addr >= range.start && addr < range.end) {
+      offset = type_ == ModuleType::SO ? addr - range.start : addr;
       return true;
-  }
+    }
   return false;
 }
 
@@ -315,9 +317,7 @@ bool ProcSyms::Module::find_name(const char *symname, uint64_t *addr) {
   return false;
 }
 
-bool ProcSyms::Module::find_addr(uint64_t addr, struct bcc_symbol *sym) {
-  uint64_t offset = type_ == ModuleType::SO ? (addr - start()) : addr;
-
+bool ProcSyms::Module::find_addr(uint64_t offset, struct bcc_symbol *sym) {
   load_sym_table();
 
   sym->module = name_.c_str();
index cb0d950c1f6a8bd0e8a30f1386e09f4f05c3e45f..9a170c194b9402e1ac2efd3dfb97927176bca42d 100644 (file)
@@ -136,9 +136,9 @@ class ProcSyms : SymbolCache {
     std::vector<Symbol> syms_;
 
     void load_sym_table();
-    bool contains(uint64_t addr) const;
+    bool contains(uint64_t addr, uint64_t &offset) const;
     uint64_t start() const { return ranges_.begin()->start; }
-    bool find_addr(uint64_t addr, struct bcc_symbol *sym);
+    bool find_addr(uint64_t offset, struct bcc_symbol *sym);
     bool find_name(const char *symname, uint64_t *addr);
 
     static int _add_symbol(const char *symname, uint64_t start, uint64_t end,