diff --git a/libutils/Android.bp b/libutils/Android.bp index 1b292857c..f6636719b 100644 --- a/libutils/Android.bp +++ b/libutils/Android.bp @@ -44,14 +44,6 @@ cc_library_headers { export_include_dirs: ["include"], target: { - android: { - header_libs: ["libbacktrace_headers"], - export_header_lib_headers: ["libbacktrace_headers"], - }, - host_linux: { - header_libs: ["libbacktrace_headers"], - export_header_lib_headers: ["libbacktrace_headers"], - }, linux_bionic: { enabled: true, }, @@ -196,7 +188,7 @@ cc_library { shared_libs: [ "libutils", - "libbacktrace", + "libunwindstack", ], target: { diff --git a/libutils/CallStack.cpp b/libutils/CallStack.cpp index fe6f33d74..f19ba6a3c 100644 --- a/libutils/CallStack.cpp +++ b/libutils/CallStack.cpp @@ -20,7 +20,7 @@ #include #include -#include +#include #define CALLSTACK_WEAK // Don't generate weak definitions. #include @@ -39,14 +39,25 @@ CallStack::~CallStack() { } void CallStack::update(int32_t ignoreDepth, pid_t tid) { + if (ignoreDepth < 0) { + ignoreDepth = 0; + } + mFrameLines.clear(); - std::unique_ptr backtrace(Backtrace::Create(BACKTRACE_CURRENT_PROCESS, tid)); - if (!backtrace->Unwind(ignoreDepth)) { - ALOGW("%s: Failed to unwind callstack.", __FUNCTION__); + unwindstack::AndroidLocalUnwinder unwinder; + unwindstack::AndroidUnwinderData data; + std::optional tid_val; + if (tid != -1) { + *tid_val = tid; } - for (size_t i = 0; i < backtrace->NumFrames(); i++) { - mFrameLines.push_back(String8(backtrace->FormatFrameData(i).c_str())); + if (!unwinder.Unwind(tid_val, data)) { + ALOGW("%s: Failed to unwind callstack: %s", __FUNCTION__, data.GetErrorString().c_str()); + } + for (size_t i = ignoreDepth; i < data.frames.size(); i++) { + auto& frame = data.frames[i]; + frame.num -= ignoreDepth; + mFrameLines.push_back(String8(unwinder.FormatFrame(frame).c_str())); } } diff --git a/libutils/include/utils/CallStack.h b/libutils/include/utils/CallStack.h index 7a4a345d0..fe4d4f564 100644 --- a/libutils/include/utils/CallStack.h +++ b/libutils/include/utils/CallStack.h @@ -20,7 +20,6 @@ #include #include -#include #include #include @@ -59,7 +58,7 @@ public: // Immediately collect the stack traces for the specified thread. // The default is to dump the stack of the current call. - void update(int32_t ignoreDepth = 1, pid_t tid = BACKTRACE_CURRENT_THREAD); + void update(int32_t ignoreDepth = 1, pid_t tid = -1); // Dump a stack trace to the log using the supplied logtag. void log(const char* logtag,