summaryrefslogtreecommitdiffstats
path: root/debuggerd/backtrace.c
diff options
context:
space:
mode:
Diffstat (limited to 'debuggerd/backtrace.c')
-rw-r--r--debuggerd/backtrace.c41
1 files changed, 19 insertions, 22 deletions
diff --git a/debuggerd/backtrace.c b/debuggerd/backtrace.c
index f42f24c..6f82792 100644
--- a/debuggerd/backtrace.c
+++ b/debuggerd/backtrace.c
@@ -27,13 +27,11 @@
#include <sys/types.h>
#include <sys/ptrace.h>
-#include <corkscrew/backtrace.h>
+#include <backtrace/backtrace.h>
-#include "tombstone.h"
+#include "backtrace.h"
#include "utility.h"
-#define STACK_DEPTH 32
-
static void dump_process_header(log_t* log, pid_t pid) {
char path[PATH_MAX];
char procnamebuf[1024];
@@ -62,7 +60,7 @@ static void dump_process_footer(log_t* log, pid_t pid) {
_LOG(log, SCOPE_AT_FAULT, "\n----- end %d -----\n", pid);
}
-static void dump_thread(log_t* log, pid_t tid, ptrace_context_t* context, bool attached,
+static void dump_thread(log_t* log, pid_t tid, bool attached,
bool* detach_failed, int* total_sleep_time_usec) {
char path[PATH_MAX];
char threadnamebuf[1024];
@@ -91,20 +89,12 @@ static void dump_thread(log_t* log, pid_t tid, ptrace_context_t* context, bool a
wait_for_stop(tid, total_sleep_time_usec);
- backtrace_frame_t backtrace[STACK_DEPTH];
- ssize_t frames = unwind_backtrace_ptrace(tid, context, backtrace, 0, STACK_DEPTH);
- if (frames <= 0) {
- _LOG(log, SCOPE_AT_FAULT, "Could not obtain stack trace for thread.\n");
+ backtrace_t backtrace;
+ if (!backtrace_get_data(&backtrace, tid)) {
+ _LOG(log, SCOPE_AT_FAULT, "Could not create backtrace context.\n");
} else {
- backtrace_symbol_t backtrace_symbols[STACK_DEPTH];
- get_backtrace_symbols_ptrace(context, backtrace, frames, backtrace_symbols);
- for (size_t i = 0; i < (size_t)frames; i++) {
- char line[MAX_BACKTRACE_LINE_LENGTH];
- format_backtrace_line(i, &backtrace[i], &backtrace_symbols[i],
- line, MAX_BACKTRACE_LINE_LENGTH);
- _LOG(log, SCOPE_AT_FAULT, " %s\n", line);
- }
- free_backtrace_symbols(backtrace_symbols, frames);
+ dump_backtrace_to_log(&backtrace, log, SCOPE_AT_FAULT, " ");
+ backtrace_free_data(&backtrace);
}
if (!attached && ptrace(PTRACE_DETACH, tid, 0, 0) != 0) {
@@ -120,9 +110,8 @@ void dump_backtrace(int fd, int amfd, pid_t pid, pid_t tid, bool* detach_failed,
log.amfd = amfd;
log.quiet = true;
- ptrace_context_t* context = load_ptrace_context(tid);
dump_process_header(&log, pid);
- dump_thread(&log, tid, context, true, detach_failed, total_sleep_time_usec);
+ dump_thread(&log, tid, true, detach_failed, total_sleep_time_usec);
char task_path[64];
snprintf(task_path, sizeof(task_path), "/proc/%d/task", pid);
@@ -140,11 +129,19 @@ void dump_backtrace(int fd, int amfd, pid_t pid, pid_t tid, bool* detach_failed,
continue;
}
- dump_thread(&log, new_tid, context, false, detach_failed, total_sleep_time_usec);
+ dump_thread(&log, new_tid, false, detach_failed, total_sleep_time_usec);
}
closedir(d);
}
dump_process_footer(&log, pid);
- free_ptrace_context(context);
+}
+
+void dump_backtrace_to_log(const backtrace_t* backtrace, log_t* log,
+ int scope_flags, const char* prefix) {
+ char buf[512];
+ for (size_t i = 0; i < backtrace->num_frames; i++) {
+ backtrace_format_frame_data(&backtrace->frames[i], i, buf, sizeof(buf));
+ _LOG(log, scope_flags, "%s%s\n", prefix, buf);
+ }
}