summaryrefslogtreecommitdiffstats
path: root/libbacktrace/unwind_remote.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbacktrace/unwind_remote.c')
-rw-r--r--libbacktrace/unwind_remote.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/libbacktrace/unwind_remote.c b/libbacktrace/unwind_remote.c
index ebbde2e..1c624d7 100644
--- a/libbacktrace/unwind_remote.c
+++ b/libbacktrace/unwind_remote.c
@@ -46,6 +46,7 @@ static bool remote_get_frames(backtrace_t* backtrace) {
bool returnValue = true;
backtrace->num_frames = 0;
uintptr_t map_start;
+ unw_word_t value;
do {
frame = &backtrace->frames[backtrace->num_frames];
frame->stack_size = 0;
@@ -54,18 +55,21 @@ static bool remote_get_frames(backtrace_t* backtrace) {
frame->proc_name = NULL;
frame->proc_offset = 0;
- ret = unw_get_reg(&cursor, UNW_REG_IP, &frame->pc);
+ ret = unw_get_reg(&cursor, UNW_REG_IP, &value);
if (ret < 0) {
ALOGW("remote_get_frames: Failed to read IP %d\n", ret);
returnValue = false;
break;
}
- ret = unw_get_reg(&cursor, UNW_REG_SP, &frame->sp);
+ frame->pc = (uintptr_t)value;
+ ret = unw_get_reg(&cursor, UNW_REG_SP, &value);
if (ret < 0) {
ALOGW("remote_get_frames: Failed to read SP %d\n", ret);
returnValue = false;
break;
}
+ frame->sp = (uintptr_t)value;
+
if (backtrace->num_frames) {
backtrace_frame_data_t* prev = &backtrace->frames[backtrace->num_frames-1];
prev->stack_size = frame->sp - prev->sp;
@@ -139,8 +143,11 @@ char* remote_get_proc_name(const backtrace_t* backtrace, uintptr_t pc,
backtrace_private_t* data = (backtrace_private_t*)backtrace->private_data;
char buf[512];
- if (unw_get_proc_name_by_ip(data->addr_space, pc, buf, sizeof(buf), offset,
+ *offset = 0;
+ unw_word_t value;
+ if (unw_get_proc_name_by_ip(data->addr_space, pc, buf, sizeof(buf), &value,
data->upt_info) >= 0 && buf[0] != '\0') {
+ *offset = (uintptr_t)value;
char* symbol = demangle_symbol_name(buf);
if (!symbol) {
symbol = strdup(buf);