if (newline)
newline[0] = '\0';
- callback(cursor, begin, len - 1, 0, payload);
+ callback(cursor, begin, len, 0, payload);
}
free(line);
sym->offset = 0x0;
for (Module &mod : modules_) {
- if (addr >= mod.start_ && addr <= mod.end_)
+ if (addr >= mod.start_ && addr < mod.end_)
return mod.find_addr(addr, sym);
}
return false;
bcc_perf_map_foreach_sym(name_.c_str(), _add_symbol, this);
else
bcc_elf_foreach_sym(name_.c_str(), _add_symbol, this);
+
+ std::sort(syms_.begin(), syms_.end());
}
bool ProcSyms::Module::find_name(const char *symname, uint64_t *addr) {
sym->module = name_.c_str();
sym->offset = offset;
- for (Symbol &s : syms_) {
- if (offset >= s.start && offset <= (s.start + s.size)) {
- sym->name = s.name.c_str();
- sym->offset = (offset - s.start);
- return true;
- }
+ auto it = std::upper_bound(syms_.begin(), syms_.end(), Symbol("", offset, 0));
+ if (it != syms_.begin())
+ --it;
+ else
+ it = syms_.end();
+
+ if (it != syms_.end()
+ && offset >= it->start && offset < it->start + it->size) {
+ sym->name = it->name.c_str();
+ sym->offset = (offset - it->start);
+ return true;
}
+
return false;
}
return -1;
}
fprintf(file, "%llx 10 dummy_fn\n", map_addr);
+ fprintf(file, "%llx 10 right_next_door_fn\n", map_addr + 0x10);
fclose(file);
sleep(5);
REQUIRE(sym.module);
REQUIRE(string(sym.module) == perf_map_path(child));
REQUIRE(string("dummy_fn") == sym.name);
+
+ REQUIRE(bcc_symcache_resolve(resolver, (unsigned long long)map_addr + 0x10,
+ &sym) == 0);
+ REQUIRE(sym.module);
+ REQUIRE(string(sym.module) == perf_map_path(child));
+ REQUIRE(string("right_next_door_fn") == sym.name);
}
SECTION("separate namespace") {