diff options
Diffstat (limited to 'debuggerd/backtrace.c')
-rw-r--r-- | debuggerd/backtrace.c | 41 |
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); + } } |