diff --git a/framework/sysutils.cpp b/framework/sysutils.cpp index 5c4bd00..70519eb 100644 --- a/framework/sysutils.cpp +++ b/framework/sysutils.cpp @@ -207,6 +207,8 @@ bool __pst_parameter::handle_dwarf(Dwarf_Die* result) name = dwarf_diename(result); is_variable = (dwarf_tag(result) == DW_TAG_variable); + + dwarf_decl_line(result, (int*)&line); // Get reference to attribute type of the parameter/variable attr = dwarf_attr(result, DW_AT_type, &attr_mem); ctx->log(SEVERITY_DEBUG, "Handle '%s' %s", name.c_str(), dwarf_tag(result) == DW_TAG_formal_parameter ? "parameter" : "variable"); @@ -272,6 +274,8 @@ bool __pst_parameter::handle_dwarf(Dwarf_Die* result) } } + // handle DW_AT_default_value to get information about default value for DW_TAG_formal_parameter type of function + return true; } @@ -280,6 +284,7 @@ bool __pst_function::print_dwarf() //std::vector::const_iterator param; //for (param = params.begin(); param != params.end(); ++param) { + ctx->print("%s:%u: ", file.c_str(), line); bool first = true; bool start_variable = false; for(auto param : params) { if(param.is_return) { @@ -295,7 +300,11 @@ bool __pst_function::print_dwarf() ctx->print("{\n"); start_variable = true; } - ctx->print("\t"); + if(param.line) { + ctx->print("%04u: ", param.line); + } else { + ctx->print(" "); + } param.print_dwarf(); ctx->print(";\n"); } else { @@ -412,11 +421,10 @@ bool __pst_function::unwind(Dwfl* dwfl, Dwfl_Module* module, Dwarf_Addr addr) { pc = addr; - Dwfl_Line *line = dwfl_getsrc(dwfl, addr); - if(line != NULL) { - int nline; + Dwfl_Line *dwline = dwfl_getsrc(dwfl, addr); + if(dwline != NULL) { Dwarf_Addr addr; - const char* filename = dwfl_lineinfo (line, &addr, &nline, NULL, NULL, NULL); + const char* filename = dwfl_lineinfo (dwline, &addr, &line, NULL, NULL, NULL); if(filename) { const char* str = strrchr(filename, '/'); if(str && *str != 0) { @@ -424,7 +432,8 @@ bool __pst_function::unwind(Dwfl* dwfl, Dwfl_Module* module, Dwarf_Addr addr) } else { str = filename; } - ctx->print("%s:%d", str, nline); + file = str; + ctx->print("%s:%d", str, line); } else { ctx->print("%p", (void*)addr); } diff --git a/framework/sysutils.h b/framework/sysutils.h index 8f84ffb..83e42e1 100644 --- a/framework/sysutils.h +++ b/framework/sysutils.h @@ -37,6 +37,7 @@ typedef struct __pst_parameter { is_return = false; is_variable = false; value = 0; + line = 0; } bool handle_dwarf(Dwarf_Die* d); @@ -45,6 +46,7 @@ typedef struct __pst_parameter { Dwarf_Die* die; // DWARF DIE containing parameter's definition std::string name; // parameter's name + uint32_t line; // line of parameter definition Dwarf_Word size; // size of parameter in bytes int type; // base type of parameter in DW_TAG_XXX types enumeration std::vector types; // list of parameter's definitions i.e. 'typedef', 'uint32_t'