fix for find dwarf CU for function, fix for find library base address

This commit is contained in:
2020-01-16 16:51:36 +04:00
parent 18450ef1b2
commit 1e395e5cac
+11 -4
View File
@@ -723,10 +723,11 @@ bool __pst_handler::get_dwarf_function(pst_function* fun)
{ {
Dwarf_Addr mod_cu = 0; Dwarf_Addr mod_cu = 0;
// get CU(Compilation Unit) debug definition // get CU(Compilation Unit) debug definition
Dwarf_Die* cdie = dwfl_module_addrdie(module, addr, &mod_cu); module = dwfl_addrmodule(dwfl, fun->pc);
Dwarf_Die* cdie = dwfl_module_addrdie(module, fun->pc, &mod_cu);
//Dwarf_Die* cdie = dwfl_addrdie(dwfl, addr, &mod_bias); //Dwarf_Die* cdie = dwfl_addrdie(dwfl, addr, &mod_bias);
if(!cdie) { if(!cdie) {
ctx.log(SEVERITY_INFO, "Failed to find DWARF DIE for address %X", addr); ctx.log(SEVERITY_INFO, "Failed to find DWARF DIE for address %X", fun->pc);
return false; return false;
} }
@@ -746,6 +747,7 @@ bool __pst_handler::get_dwarf_function(pst_function* fun)
do { do {
int tag = dwarf_tag(&result); int tag = dwarf_tag(&result);
if(tag == DW_TAG_subprogram || tag == DW_TAG_entry_point || tag == DW_TAG_inlined_subroutine) { if(tag == DW_TAG_subprogram || tag == DW_TAG_entry_point || tag == DW_TAG_inlined_subroutine) {
//ctx.log(SEVERITY_DEBUG, "function die name %s", dwarf_diename(&result));
if(!strcmp(fun->name.c_str(), dwarf_diename(&result))) { if(!strcmp(fun->name.c_str(), dwarf_diename(&result))) {
return fun->handle_dwarf(&result); return fun->handle_dwarf(&result);
} }
@@ -791,7 +793,12 @@ pst_function* __pst_handler::next_function(pst_function* f)
bool __pst_handler::handle_dwarf() bool __pst_handler::handle_dwarf()
{ {
Dl_info info;
for(pst_function* fun = next_function(NULL); fun; fun = next_function(fun)) { for(pst_function* fun = next_function(NULL); fun; fun = next_function(fun)) {
dladdr((void*)(fun->pc), &info);
ctx.base_addr = (uint64_t)info.dli_fbase;
ctx.curr_frame = fun->cursor; ctx.curr_frame = fun->cursor;
if(fun->parent) { if(fun->parent) {
ctx.next_frame = fun->parent->cursor; ctx.next_frame = fun->parent->cursor;
@@ -848,11 +855,11 @@ bool __pst_handler::unwind()
#endif #endif
ctx.offset = 0; ctx.offset = 0;
handle = dlopen(NULL, RTLD_NOW); //handle = dlopen(NULL, RTLD_NOW);
Dl_info info; Dl_info info;
dladdr(caller, &info); dladdr(caller, &info);
ctx.base_addr = (uint64_t)info.dli_fbase; ctx.base_addr = (uint64_t)info.dli_fbase;
ctx.log(SEVERITY_INFO, "Process address information: base address: %p, object name: %s", info.dli_fbase, info.dli_fname); ctx.log(SEVERITY_INFO, "Process address information: PC address: %p, base address: %p, object name: %s", caller, info.dli_fbase, info.dli_fname);
int skipped = 0; int skipped = 0;
#ifndef USE_LIBUNWIND #ifndef USE_LIBUNWIND