Cleanup and refactoring of dwarf code. Improve handling of stuff.
This commit is contained in:
parent
f5fd6942e2
commit
07a3ac1e41
@ -67,6 +67,7 @@ static int dwarf5_ranges(Dwarf_Die cu_die, Dwarf_Addr *lowest, Dwarf_Addr *highe
|
|||||||
|
|
||||||
dwarf_whatform(attr, &attrform, nullptr);
|
dwarf_whatform(attr, &attrform, nullptr);
|
||||||
/* offset is in .debug_rnglists */
|
/* offset is in .debug_rnglists */
|
||||||
|
//fprintf(stderr, "dwarf5_ranges offset: %u\n", offset);
|
||||||
res = dwarf_rnglists_get_rle_head(
|
res = dwarf_rnglists_get_rle_head(
|
||||||
attr,
|
attr,
|
||||||
attrform,
|
attrform,
|
||||||
@ -76,6 +77,8 @@ static int dwarf5_ranges(Dwarf_Die cu_die, Dwarf_Addr *lowest, Dwarf_Addr *highe
|
|||||||
&rlesetoffset,
|
&rlesetoffset,
|
||||||
nullptr
|
nullptr
|
||||||
);
|
);
|
||||||
|
assert(res == DW_DLV_OK);
|
||||||
|
//fprintf(stderr, "dwarf5_ranges rnglists_count: %u\n", rnglists_count);
|
||||||
if(res != DW_DLV_OK) {
|
if(res != DW_DLV_OK) {
|
||||||
/* ASSERT: is DW_DLV_NO_ENTRY */
|
/* ASSERT: is DW_DLV_NO_ENTRY */
|
||||||
dwarf_dealloc_attribute(attr);
|
dwarf_dealloc_attribute(attr);
|
||||||
@ -120,6 +123,7 @@ static int dwarf5_ranges(Dwarf_Die cu_die, Dwarf_Addr *lowest, Dwarf_Addr *highe
|
|||||||
case DW_RLE_start_end:
|
case DW_RLE_start_end:
|
||||||
case DW_RLE_startx_length:
|
case DW_RLE_startx_length:
|
||||||
case DW_RLE_start_length:
|
case DW_RLE_start_length:
|
||||||
|
//fprintf(stderr, "%08x %08x\n", cooked1, cooked2);
|
||||||
if(cooked1 < *lowest) {
|
if(cooked1 < *lowest) {
|
||||||
*lowest = cooked1;
|
*lowest = cooked1;
|
||||||
}
|
}
|
||||||
@ -259,15 +263,17 @@ namespace cpptrace {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//if(die_object(dbg, die).get_tag() == DW_TAG_compile_unit) {
|
||||||
|
// fprintf(stderr, "Searching range list\n");
|
||||||
|
//}
|
||||||
if(version >= 5) {
|
if(version >= 5) {
|
||||||
ret = dwarf5_ranges(die,
|
ret = dwarf5_ranges(die, &lowest, &highest);
|
||||||
&lowest,&highest);
|
|
||||||
} else {
|
} else {
|
||||||
ret = dwarf4_ranges(dbg,die,cu_lowpc,
|
ret = dwarf4_ranges(dbg, die, cu_lowpc, &lowest, &highest);
|
||||||
&lowest,&highest);
|
|
||||||
}
|
}
|
||||||
//fprintf(stderr, "low: %llu high: %llu\n", lowest, highest);
|
//fprintf(stderr, "low: %llu high: %llu\n", lowest, highest);
|
||||||
if(pc >= lowest && pc < highest) {
|
if(pc >= lowest && pc < highest) {
|
||||||
|
//fprintf(stderr, "Found in range list\n");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -342,7 +348,8 @@ namespace cpptrace {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::string get_name() const {
|
std::string get_name() const {
|
||||||
char* name;
|
char empty[] = "";
|
||||||
|
char* name = empty;
|
||||||
int ret = dwarf_diename(die, &name, nullptr);
|
int ret = dwarf_diename(die, &name, nullptr);
|
||||||
std::string str;
|
std::string str;
|
||||||
if(ret != DW_DLV_NO_ENTRY) {
|
if(ret != DW_DLV_NO_ENTRY) {
|
||||||
@ -362,7 +369,7 @@ namespace cpptrace {
|
|||||||
assert(ret == DW_DLV_OK);
|
assert(ret == DW_DLV_OK);
|
||||||
str = raw_str;
|
str = raw_str;
|
||||||
dwarf_dealloc(dbg, raw_str, DW_DLA_STRING);
|
dwarf_dealloc(dbg, raw_str, DW_DLA_STRING);
|
||||||
dwarf_dealloc(dbg, attr, DW_DLA_ATTR);
|
dwarf_dealloc_attribute(attr);
|
||||||
return str;
|
return str;
|
||||||
} else {
|
} else {
|
||||||
return nullopt;
|
return nullopt;
|
||||||
@ -376,7 +383,7 @@ namespace cpptrace {
|
|||||||
return false;
|
return false;
|
||||||
} else if(ret == DW_DLV_OK) {
|
} else if(ret == DW_DLV_OK) {
|
||||||
// TODO: Better impl that doesn't require allocation....?
|
// TODO: Better impl that doesn't require allocation....?
|
||||||
dwarf_dealloc(dbg, attr, DW_DLA_ATTR);
|
dwarf_dealloc_attribute(attr);
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "Error\n");
|
fprintf(stderr, "Error\n");
|
||||||
@ -425,6 +432,7 @@ namespace cpptrace {
|
|||||||
Dwarf_Die targ_die_a = 0;
|
Dwarf_Die targ_die_a = 0;
|
||||||
ret = dwarf_offdie_b(dbg, goff, is_info, &targ_die_a, nullptr);
|
ret = dwarf_offdie_b(dbg, goff, is_info, &targ_die_a, nullptr);
|
||||||
assert(ret == DW_DLV_OK);
|
assert(ret == DW_DLV_OK);
|
||||||
|
dwarf_dealloc_attribute(attr);
|
||||||
return die_object(dbg, targ_die_a);
|
return die_object(dbg, targ_die_a);
|
||||||
}
|
}
|
||||||
case DW_FORM_ref_addr:
|
case DW_FORM_ref_addr:
|
||||||
@ -435,6 +443,7 @@ namespace cpptrace {
|
|||||||
Dwarf_Die targ_die_a = 0;
|
Dwarf_Die targ_die_a = 0;
|
||||||
ret = dwarf_offdie_b(dbg, off, is_info_a, &targ_die_a, nullptr);
|
ret = dwarf_offdie_b(dbg, off, is_info_a, &targ_die_a, nullptr);
|
||||||
assert(ret == DW_DLV_OK);
|
assert(ret == DW_DLV_OK);
|
||||||
|
dwarf_dealloc_attribute(attr);
|
||||||
return die_object(dbg, targ_die_a);
|
return die_object(dbg, targ_die_a);
|
||||||
}
|
}
|
||||||
case DW_FORM_ref_sig8:
|
case DW_FORM_ref_sig8:
|
||||||
@ -446,6 +455,7 @@ namespace cpptrace {
|
|||||||
Dwarf_Bool targ_is_info = false;
|
Dwarf_Bool targ_is_info = false;
|
||||||
ret = dwarf_find_die_given_sig8(dbg, &signature, &targdie, &targ_is_info, nullptr);
|
ret = dwarf_find_die_given_sig8(dbg, &signature, &targdie, &targ_is_info, nullptr);
|
||||||
assert(ret == DW_DLV_OK);
|
assert(ret == DW_DLV_OK);
|
||||||
|
dwarf_dealloc_attribute(attr);
|
||||||
return die_object(dbg, targdie);
|
return die_object(dbg, targdie);
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@ -523,7 +533,7 @@ namespace cpptrace {
|
|||||||
if(ret == DW_DLV_NO_ENTRY) {
|
if(ret == DW_DLV_NO_ENTRY) {
|
||||||
return false;
|
return false;
|
||||||
} else if(ret == DW_DLV_OK) {
|
} else if(ret == DW_DLV_OK) {
|
||||||
dwarf_dealloc(dbg, attr, DW_DLA_ATTR);
|
dwarf_dealloc_attribute(attr);
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "Error\n");
|
fprintf(stderr, "Error\n");
|
||||||
@ -797,8 +807,8 @@ namespace cpptrace {
|
|||||||
if(dump_dwarf) {
|
if(dump_dwarf) {
|
||||||
fprintf(
|
fprintf(
|
||||||
stderr,
|
stderr,
|
||||||
"-------------> %d %s %s\n",
|
"-------------> %08llx %s %s\n",
|
||||||
dwversion,
|
(unsigned long long) die.get_global_offset(),
|
||||||
die.get_tag_name(),
|
die.get_tag_name(),
|
||||||
die.get_name().c_str()
|
die.get_name().c_str()
|
||||||
);
|
);
|
||||||
@ -817,9 +827,9 @@ namespace cpptrace {
|
|||||||
die.get_tag_name()
|
die.get_tag_name()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if(dump_dwarf) {
|
//if(dump_dwarf) {
|
||||||
fprintf(stderr, "pc in die <-----------------------------------\n");
|
// fprintf(stderr, "pc in die <-----------------------------------\n");
|
||||||
}
|
//}
|
||||||
if(die.get_tag() == DW_TAG_subprogram) {
|
if(die.get_tag() == DW_TAG_subprogram) {
|
||||||
retrieve_symbol_for_subprogram(dbg, die, pc, dwversion, frame);
|
retrieve_symbol_for_subprogram(dbg, die, pc, dwversion, frame);
|
||||||
}
|
}
|
||||||
@ -1028,7 +1038,7 @@ namespace cpptrace {
|
|||||||
if(trace_dwarf) {
|
if(trace_dwarf) {
|
||||||
fprintf(
|
fprintf(
|
||||||
stderr,
|
stderr,
|
||||||
"%s %08llx %s\n",
|
"Starting resolution for %s %08llx %s\n",
|
||||||
obj_path.c_str(),
|
obj_path.c_str(),
|
||||||
(unsigned long long)frame_info.obj_address,
|
(unsigned long long)frame_info.obj_address,
|
||||||
frame_info.symbol.c_str()
|
frame_info.symbol.c_str()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user