summaryrefslogtreecommitdiffstats
path: root/libcorkscrew
diff options
context:
space:
mode:
Diffstat (limited to 'libcorkscrew')
-rw-r--r--libcorkscrew/arch-arm/backtrace-arm.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/libcorkscrew/arch-arm/backtrace-arm.c b/libcorkscrew/arch-arm/backtrace-arm.c
index 93144f033..597662eb0 100644
--- a/libcorkscrew/arch-arm/backtrace-arm.c
+++ b/libcorkscrew/arch-arm/backtrace-arm.c
@@ -124,14 +124,16 @@ static uintptr_t get_exception_handler(
const ptrace_context_t* context, pid_t tid, uintptr_t pc) {
uintptr_t exidx_start;
size_t exidx_size;
+ const map_info_t* mi;
if (tid < 0) {
+ mi = NULL;
exidx_start = find_exidx(pc, &exidx_size);
} else {
- const map_info_t* mi = find_map_info(context->map_info_list, pc);
+ mi = find_map_info(context->map_info_list, pc);
if (mi && mi->data) {
const map_info_data_t* data = (const map_info_data_t*)mi->data;
exidx_start = data->exidx_start;
- exidx_size = data->exidx_size;
+ exidx_size = data->exidx_size / 8;
} else {
exidx_start = 0;
exidx_size = 0;
@@ -147,7 +149,7 @@ static uintptr_t get_exception_handler(
pc -= 2;
}
- uint32_t handler = 0;
+ uintptr_t handler = 0;
if (exidx_start) {
uint32_t low = 0;
uint32_t high = exidx_size;
@@ -189,8 +191,10 @@ static uintptr_t get_exception_handler(
break;
}
}
- LOGV("get handler: pc=0x%08x, exidx_start=0x%08x, exidx_size=%d, handler=0x%08x",
- pc, exidx_start, exidx_size, handler);
+ LOGV("get_exception_handler: pc=0x%08x, module='%s', module_start=0x%08x, "
+ "exidx_start=0x%08x, exidx_size=%d, handler=0x%08x",
+ pc, mi ? mi->name : "<unknown>", mi ? mi->start : 0,
+ exidx_start, exidx_size, handler);
return handler;
}
@@ -455,7 +459,7 @@ static ssize_t unwind_backtrace_common(pid_t tid, const ptrace_context_t* contex
// Don't return the SP for this second frame because we don't
// know how big the first one is so we don't know where this
// one starts.
- frame = add_backtrace_entry(state->gregs[R_LR], backtrace,
+ add_backtrace_entry(state->gregs[R_LR], backtrace,
ignore_depth, max_depth, &ignored_frames, &returned_frames);
}
return returned_frames;