eh_elf: tentative changes to integrate
This commit is contained in:
parent
16c00db4bb
commit
1ee9a2e1e1
1 changed files with 39 additions and 0 deletions
|
@ -472,6 +472,39 @@ get_proc_name(unw_addr_space_t __maybe_unused as,
|
||||||
return -UNW_EINVAL;
|
return -UNW_EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
get_mmap(unw_mmap_entry_t* entries, size_t* count, void* arg) {
|
||||||
|
struct unwind_info* unw_info = arg;
|
||||||
|
struct map_groups* mgroups = unw_info->thread->mg;
|
||||||
|
int id;
|
||||||
|
|
||||||
|
// == Count entries ==
|
||||||
|
*count = 0;
|
||||||
|
for(struct map* map = map_groups__first(mgroups, MAP__FUNCTION);
|
||||||
|
map;
|
||||||
|
map = map_groups__next(map))
|
||||||
|
{
|
||||||
|
++(*count);
|
||||||
|
}
|
||||||
|
|
||||||
|
// == Allocate ==
|
||||||
|
entries = (unw_mmap_entry_t*)
|
||||||
|
malloc(sizeof(unw_mmap_entry_t) * (*count)); // Will be free'd
|
||||||
|
|
||||||
|
// == Fill entries ==
|
||||||
|
id = 0;
|
||||||
|
for(struct map* map = map_groups__first(mgroups, MAP__FUNCTION);
|
||||||
|
map;
|
||||||
|
map = map_groups__next(map), ++id)
|
||||||
|
{
|
||||||
|
entries[id].beg_ip = map->start;
|
||||||
|
entries[id].end_ip = map->end;
|
||||||
|
entries[id].offset = map->start - map->map_ip(map, map->start);
|
||||||
|
entries[id].object_name = malloc(strlen(map->dso->long_name) + 1);
|
||||||
|
strcpy(entries[id].object_name, map->dso->long_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int access_dso_mem(struct unwind_info *ui, unw_word_t addr,
|
static int access_dso_mem(struct unwind_info *ui, unw_word_t addr,
|
||||||
unw_word_t *data)
|
unw_word_t *data)
|
||||||
{
|
{
|
||||||
|
@ -627,6 +660,12 @@ static unw_accessors_t accessors = {
|
||||||
.access_fpreg = access_fpreg,
|
.access_fpreg = access_fpreg,
|
||||||
.resume = resume,
|
.resume = resume,
|
||||||
.get_proc_name = get_proc_name,
|
.get_proc_name = get_proc_name,
|
||||||
|
.eh_elf_init = {
|
||||||
|
.init_mode = UNW_EH_ELF_INIT_MMAP,
|
||||||
|
.init_data = {
|
||||||
|
.get_mmap = get_mmap,
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static int _unwind__prepare_access(struct thread *thread)
|
static int _unwind__prepare_access(struct thread *thread)
|
||||||
|
|
Loading…
Reference in a new issue