diff options
Diffstat (limited to 'debuggerd/libdebuggerd')
-rw-r--r-- | debuggerd/libdebuggerd/backtrace.cpp | 48 | ||||
-rw-r--r-- | debuggerd/libdebuggerd/include/backtrace.h | 5 | ||||
-rw-r--r-- | debuggerd/libdebuggerd/include/tombstone.h | 4 | ||||
-rw-r--r-- | debuggerd/libdebuggerd/tombstone.cpp | 7 |
4 files changed, 55 insertions, 9 deletions
diff --git a/debuggerd/libdebuggerd/backtrace.cpp b/debuggerd/libdebuggerd/backtrace.cpp index 066444242..df49aef37 100644 --- a/debuggerd/libdebuggerd/backtrace.cpp +++ b/debuggerd/libdebuggerd/backtrace.cpp @@ -67,15 +67,15 @@ static void dump_process_footer(log_t* log, pid_t pid) { _LOG(log, logtype::BACKTRACE, "\n----- end %d -----\n", pid); } -static void dump_thread(log_t* log, BacktraceMap* map, pid_t pid, pid_t tid) { +static void log_thread_name(log_t* log, pid_t tid) { + FILE* fp; + char buf[1024]; char path[PATH_MAX]; - char threadnamebuf[1024]; char* threadname = NULL; - FILE* fp; snprintf(path, sizeof(path), "/proc/%d/comm", tid); if ((fp = fopen(path, "r"))) { - threadname = fgets(threadnamebuf, sizeof(threadnamebuf), fp); + threadname = fgets(buf, sizeof(buf), fp); fclose(fp); if (threadname) { size_t len = strlen(threadname); @@ -84,8 +84,11 @@ static void dump_thread(log_t* log, BacktraceMap* map, pid_t pid, pid_t tid) { } } } - _LOG(log, logtype::BACKTRACE, "\n\"%s\" sysTid=%d\n", threadname ? threadname : "<unknown>", tid); +} + +static void dump_thread(log_t* log, BacktraceMap* map, pid_t pid, pid_t tid) { + log_thread_name(log, tid); std::unique_ptr<Backtrace> backtrace(Backtrace::Create(pid, tid, map)); if (backtrace->Unwind(0)) { @@ -112,6 +115,41 @@ void dump_backtrace(int fd, BacktraceMap* map, pid_t pid, pid_t tid, dump_process_footer(&log, pid); } +void dump_backtrace_ucontext(int output_fd, ucontext_t* ucontext) { + pid_t pid = getpid(); + pid_t tid = gettid(); + + log_t log; + log.tfd = output_fd; + log.amfd_data = nullptr; + + log_thread_name(&log, tid); + + std::unique_ptr<Backtrace> backtrace(Backtrace::Create(pid, tid)); + if (backtrace->Unwind(0, ucontext)) { + dump_backtrace_to_log(backtrace.get(), &log, " "); + } else { + ALOGE("Unwind failed: tid = %d: %s", tid, + backtrace->GetErrorString(backtrace->GetError()).c_str()); + } +} + +void dump_backtrace_header(int output_fd) { + log_t log; + log.tfd = output_fd; + log.amfd_data = nullptr; + + dump_process_header(&log, getpid()); +} + +void dump_backtrace_footer(int output_fd) { + log_t log; + log.tfd = output_fd; + log.amfd_data = nullptr; + + dump_process_footer(&log, getpid()); +} + void dump_backtrace_to_log(Backtrace* backtrace, log_t* log, const char* prefix) { for (size_t i = 0; i < backtrace->NumFrames(); i++) { _LOG(log, logtype::BACKTRACE, "%s%s\n", prefix, backtrace->FormatFrameData(i).c_str()); diff --git a/debuggerd/libdebuggerd/include/backtrace.h b/debuggerd/libdebuggerd/include/backtrace.h index acd5eaac6..5bfdac8fc 100644 --- a/debuggerd/libdebuggerd/include/backtrace.h +++ b/debuggerd/libdebuggerd/include/backtrace.h @@ -18,6 +18,7 @@ #define _DEBUGGERD_BACKTRACE_H #include <sys/types.h> +#include <sys/ucontext.h> #include <set> #include <string> @@ -35,4 +36,8 @@ void dump_backtrace(int fd, BacktraceMap* map, pid_t pid, pid_t tid, /* Dumps the backtrace in the backtrace data structure to the log. */ void dump_backtrace_to_log(Backtrace* backtrace, log_t* log, const char* prefix); +void dump_backtrace_ucontext(int output_fd, ucontext_t* ucontext); +void dump_backtrace_header(int output_fd); +void dump_backtrace_footer(int output_fd); + #endif // _DEBUGGERD_BACKTRACE_H diff --git a/debuggerd/libdebuggerd/include/tombstone.h b/debuggerd/libdebuggerd/include/tombstone.h index aed71de22..bed371b52 100644 --- a/debuggerd/libdebuggerd/include/tombstone.h +++ b/debuggerd/libdebuggerd/include/tombstone.h @@ -39,7 +39,7 @@ void engrave_tombstone(int tombstone_fd, BacktraceMap* map, const std::set<pid_t>* siblings, uintptr_t abort_msg_address, std::string* amfd_data); -void engrave_tombstone_ucontext(int tombstone_fd, pid_t pid, pid_t tid, uintptr_t abort_msg_address, - siginfo_t* siginfo, ucontext_t* ucontext); +void engrave_tombstone_ucontext(int tombstone_fd, uintptr_t abort_msg_address, siginfo_t* siginfo, + ucontext_t* ucontext); #endif // _DEBUGGERD_TOMBSTONE_H diff --git a/debuggerd/libdebuggerd/tombstone.cpp b/debuggerd/libdebuggerd/tombstone.cpp index 4686bfdc8..c05ccc358 100644 --- a/debuggerd/libdebuggerd/tombstone.cpp +++ b/debuggerd/libdebuggerd/tombstone.cpp @@ -751,8 +751,11 @@ void engrave_tombstone(int tombstone_fd, BacktraceMap* map, dump_crash(&log, map, open_files, pid, tid, siblings, abort_msg_address); } -void engrave_tombstone_ucontext(int tombstone_fd, pid_t pid, pid_t tid, uintptr_t abort_msg_address, - siginfo_t* siginfo, ucontext_t* ucontext) { +void engrave_tombstone_ucontext(int tombstone_fd, uintptr_t abort_msg_address, siginfo_t* siginfo, + ucontext_t* ucontext) { + pid_t pid = getpid(); + pid_t tid = gettid(); + log_t log; log.current_tid = tid; log.crashed_tid = tid; |