summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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(
124 const ptrace_context_t* context, pid_t tid, uintptr_t pc) { 124 const ptrace_context_t* context, pid_t tid, uintptr_t pc) {
125 uintptr_t exidx_start; 125 uintptr_t exidx_start;
126 size_t exidx_size; 126 size_t exidx_size;
127 const map_info_t* mi;
127 if (tid < 0) { 128 if (tid < 0) {
129 mi = NULL;
128 exidx_start = find_exidx(pc, &exidx_size); 130 exidx_start = find_exidx(pc, &exidx_size);
129 } else { 131 } else {
130 const map_info_t* mi = find_map_info(context->map_info_list, pc); 132 mi = find_map_info(context->map_info_list, pc);
131 if (mi && mi->data) { 133 if (mi && mi->data) {
132 const map_info_data_t* data = (const map_info_data_t*)mi->data; 134 const map_info_data_t* data = (const map_info_data_t*)mi->data;
133 exidx_start = data->exidx_start; 135 exidx_start = data->exidx_start;
134 exidx_size = data->exidx_size; 136 exidx_size = data->exidx_size / 8;
135 } else { 137 } else {
136 exidx_start = 0; 138 exidx_start = 0;
137 exidx_size = 0; 139 exidx_size = 0;
@@ -147,7 +149,7 @@ static uintptr_t get_exception_handler(
147 pc -= 2; 149 pc -= 2;
148 } 150 }
149 151
150 uint32_t handler = 0; 152 uintptr_t handler = 0;
151 if (exidx_start) { 153 if (exidx_start) {
152 uint32_t low = 0; 154 uint32_t low = 0;
153 uint32_t high = exidx_size; 155 uint32_t high = exidx_size;
@@ -189,8 +191,10 @@ static uintptr_t get_exception_handler(
189 break; 191 break;
190 } 192 }
191 } 193 }
192 LOGV("get handler: pc=0x%08x, exidx_start=0x%08x, exidx_size=%d, handler=0x%08x", 194 LOGV("get_exception_handler: pc=0x%08x, module='%s', module_start=0x%08x, "
193 pc, exidx_start, exidx_size, handler); 195 "exidx_start=0x%08x, exidx_size=%d, handler=0x%08x",
196 pc, mi ? mi->name : "<unknown>", mi ? mi->start : 0,
197 exidx_start, exidx_size, handler);
194 return handler; 198 return handler;
195} 199}
196 200
@@ -455,7 +459,7 @@ static ssize_t unwind_backtrace_common(pid_t tid, const ptrace_context_t* contex
455 // Don't return the SP for this second frame because we don't 459 // Don't return the SP for this second frame because we don't
456 // know how big the first one is so we don't know where this 460 // know how big the first one is so we don't know where this
457 // one starts. 461 // one starts.
458 frame = add_backtrace_entry(state->gregs[R_LR], backtrace, 462 add_backtrace_entry(state->gregs[R_LR], backtrace,
459 ignore_depth, max_depth, &ignored_frames, &returned_frames); 463 ignore_depth, max_depth, &ignored_frames, &returned_frames);
460 } 464 }
461 return returned_frames; 465 return returned_frames;