* limitations under the License.
*/
+#include <cxxabi.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
if (syms_.empty()) {
sym->name = nullptr;
+ sym->demangle_name = nullptr;
sym->module = nullptr;
sym->offset = 0x0;
return false;
auto it = std::upper_bound(syms_.begin(), syms_.end(), Symbol("", addr)) - 1;
sym->name = (*it).name.c_str();
+ sym->demangle_name = sym->name;
sym->module = "[kernel]";
sym->offset = addr - (*it).addr;
return true;
sym->module = nullptr;
sym->name = nullptr;
+ sym->demangle_name = nullptr;
sym->offset = 0x0;
for (Module &mod : modules_) {
- if (addr >= mod.start_ && addr < mod.end_)
- return mod.find_addr(addr, sym);
+ if (addr >= mod.start_ && addr < mod.end_) {
+ bool res = mod.find_addr(addr, sym);
+ if (sym->name) {
+ sym->demangle_name = abi::__cxa_demangle(sym->name, nullptr, nullptr, nullptr);
+ if (!sym->demangle_name)
+ sym->demangle_name = sym->name;
+ }
+ return res;
+ }
}
return false;
}
if libbcc.bcc_symcache_resolve(self._CACHE, addr, sym) < 0 then
return "[unknown]", 0x0
end
- return ffi.string(sym[0].name), sym[0].offset
+ return ffi.string(sym[0].demangle_name), sym[0].offset
end
}
end
psym = ct.pointer(sym)
if lib.bcc_symcache_resolve(self.cache, addr, psym) < 0:
return "[unknown]", 0
- return sym.name.decode(), sym.offset
+ return sym.demangle_name.decode(), sym.offset
def resolve_name(self, name):
addr = ct.c_ulonglong()
class bcc_symbol(ct.Structure):
_fields_ = [
('name', ct.c_char_p),
+ ('demangle_name', ct.c_char_p),
('module', ct.c_char_p),
('offset', ct.c_ulonglong),
]