| DWARF_GET_FDE_LIST(3) | Library Functions Manual | DWARF_GET_FDE_LIST(3) |
int
dwarf_get_fde_list(Dwarf_Debug dbg, Dwarf_Cie **cie_list, Dwarf_Signed *cie_count, Dwarf_Fde **fde_list, Dwarf_Signed *fde_count, Dwarf_Error *err);
int
dwarf_get_fde_list_eh(Dwarf_Debug dbg, Dwarf_Cie **cie_list, Dwarf_Signed *cie_count, Dwarf_Fde **fde_list, Dwarf_Signed *fde_count, Dwarf_Error *err);
Function dwarf_get_fde_list() retrieves frame information from the DWARF section named “.debug_frame”. For objects containing GNU style C++ exception handling information, the function dwarf_get_fde_list_eh() retrieves frame information from the section named “.eh_frame”.
Frame information is returned using opaque descriptors of type Dwarf_Cie and Dwarf_Fde. Applications need to use the other frame related functions in the DWARF(3) API set to retrieve the information contained in these descriptors.
Argument dbg should reference a DWARF debug context allocated using dwarf_init(3).
Argument cie_list should point to a location that will be set to a pointer to an array of Dwarf_Cie descriptors.
Argument cie_count should point to a location that will be set to the number of Dwarf_Cie descriptors returned.
Argument fde_list should point to a location that will be set to a pointer to an array of Dwarf_Fde descriptors.
Argument fde_count should point to a location that will be set to the number of Dwarf_Fde descriptors returned.
If argument err is not NULL, it will be used to store error information in case of an error.
Dwarf_Debug dbg;
Dwarf_Cie *cie_list, cie;
Dwarf_Fde *fde_list, fde;
Dwarf_Off fde_offset, cie_offset;
Dwarf_Unsigned func_len, fde_length, fde_instlen;
Dwarf_Signed cie_count, fde_count, cie_index;
Dwarf_Addr low_pc;
Dwarf_Ptr fde_addr, fde_inst, cie_inst;
Dwarf_Error de;
int i;
if (dwarf_get_fde_list(dbg, &cie_list, &cie_count,
&fde_list, &fde_count, &de) != DW_DLV_OK) {
errx(EXIT_FAILURE, "dwarf_get_fde_list failed: %s",
dwarf_errmsg(de));
}
for (i = 0; i < fde_count; i++) {
if (dwarf_get_fde_n(fde_list, i, &fde, &de) != DW_DLV_OK) {
warnx("dwarf_get_fde_n failed: %s",
dwarf_errmsg(de));
continue;
}
if (dwarf_get_cie_of_fde(fde, &cie, &de) != DW_DLV_OK) {
warnx("dwarf_get_fde_n failed: %s",
dwarf_errmsg(de));
continue;
}
if (dwarf_get_fde_range(fde, &low_pc, &func_len, &fde_addr,
&fde_length, &cie_offset, &cie_index, &fde_offset,
&de) != DW_DLV_OK) {
warnx("dwarf_get_fde_range failed: %s",
dwarf_errmsg(de));
continue;
}
if (dwarf_get_fde_instr_bytes(fde, &fde_inst, &fde_instlen,
&de) != DW_DLV_OK) {
warnx("dwarf_get_fde_instr_bytes failed: %s",
dwarf_errmsg(de));
continue;
}
/* ... Use the retrieved frame information ... */
}
/* Indicate that the returned arrays may be freed. */
dwarf_fde_cie_list_dealloc(dbg, cie_list, cie_count, fde_list,
fde_count);
| November 9, 2011 | NetBSD 7.2 |