diff options
-rw-r--r-- | init/Android.bp | 3 | ||||
-rw-r--r-- | init/init.cpp | 16 | ||||
-rw-r--r-- | init/init_test.cpp | 1 | ||||
-rw-r--r-- | init/reboot_utils.cpp | 14 | ||||
-rw-r--r-- | libstats/socket_lazy/TEST_MAPPING | 2 | ||||
-rw-r--r-- | libutils/Android.bp | 10 | ||||
-rw-r--r-- | libutils/CallStack.cpp | 23 | ||||
-rw-r--r-- | libutils/include/utils/CallStack.h | 3 | ||||
-rw-r--r-- | libutils/include/utils/Thread.h | 4 | ||||
-rw-r--r-- | rootdir/init.rc | 8 |
10 files changed, 41 insertions, 43 deletions
diff --git a/init/Android.bp b/init/Android.bp index dd67d04c0..f91265e8a 100644 --- a/init/Android.bp +++ b/init/Android.bp @@ -178,7 +178,6 @@ libinit_cc_defaults { "update_metadata-protos", ], shared_libs: [ - "libbacktrace", "libbase", "libbootloader_message", "libcrypto", @@ -195,6 +194,7 @@ libinit_cc_defaults { "libprocessgroup", "libprocessgroup_setup", "libselinux", + "libunwindstack", "libutils", "libziparchive", ], @@ -352,7 +352,6 @@ cc_binary { "libgsi", "liblzma", "libunwindstack_no_dex", - "libbacktrace_no_dex", "libmodprobe", "libext2_uuid", "libprotobuf-cpp-lite", diff --git a/init/init.cpp b/init/init.cpp index 038f1725d..f8330bc5b 100644 --- a/init/init.cpp +++ b/init/init.cpp @@ -48,7 +48,6 @@ #include <android-base/properties.h> #include <android-base/stringprintf.h> #include <android-base/strings.h> -#include <backtrace/Backtrace.h> #include <fs_avb/fs_avb.h> #include <fs_mgr_vendor_overlay.h> #include <keyutils.h> @@ -58,6 +57,7 @@ #include <processgroup/processgroup.h> #include <processgroup/setup.h> #include <selinux/android.h> +#include <unwindstack/AndroidUnwinder.h> #include "action_parser.h" #include "builtins.h" @@ -253,12 +253,14 @@ static class ShutdownState { } shutdown_state; static void UnwindMainThreadStack() { - std::unique_ptr<Backtrace> backtrace(Backtrace::Create(BACKTRACE_CURRENT_PROCESS, 1)); - if (!backtrace->Unwind(0)) { - LOG(ERROR) << __FUNCTION__ << "sys.powerctl: Failed to unwind callstack."; - } - for (size_t i = 0; i < backtrace->NumFrames(); i++) { - LOG(ERROR) << "sys.powerctl: " << backtrace->FormatFrameData(i); + unwindstack::AndroidLocalUnwinder unwinder; + unwindstack::AndroidUnwinderData data; + if (!unwinder.Unwind(data)) { + LOG(ERROR) << __FUNCTION__ + << "sys.powerctl: Failed to unwind callstack: " << data.GetErrorString(); + } + for (const auto& frame : data.frames) { + LOG(ERROR) << "sys.powerctl: " << unwinder.FormatFrame(frame); } } diff --git a/init/init_test.cpp b/init/init_test.cpp index 8550ec8f3..8c19d5f5a 100644 --- a/init/init_test.cpp +++ b/init/init_test.cpp @@ -156,6 +156,7 @@ execute_third ServiceList service_list; TestInitText(init_script, test_function_map, commands, &service_list); + EXPECT_EQ(3, num_executed); } TEST(init, OverrideService) { diff --git a/init/reboot_utils.cpp b/init/reboot_utils.cpp index b3fa9fd3b..f8e1de047 100644 --- a/init/reboot_utils.cpp +++ b/init/reboot_utils.cpp @@ -26,8 +26,8 @@ #include <android-base/logging.h> #include <android-base/properties.h> #include <android-base/strings.h> -#include <backtrace/Backtrace.h> #include <cutils/android_reboot.h> +#include <unwindstack/AndroidUnwinder.h> #include "capabilities.h" #include "reboot_utils.h" @@ -157,13 +157,13 @@ void __attribute__((noreturn)) InitFatalReboot(int signal_number) { // In the parent, let's try to get a backtrace then shutdown. LOG(ERROR) << __FUNCTION__ << ": signal " << signal_number; - std::unique_ptr<Backtrace> backtrace( - Backtrace::Create(BACKTRACE_CURRENT_PROCESS, BACKTRACE_CURRENT_THREAD)); - if (!backtrace->Unwind(0)) { - LOG(ERROR) << __FUNCTION__ << ": Failed to unwind callstack."; + unwindstack::AndroidLocalUnwinder unwinder; + unwindstack::AndroidUnwinderData data; + if (!unwinder.Unwind(data)) { + LOG(ERROR) << __FUNCTION__ << ": Failed to unwind callstack: " << data.GetErrorString(); } - for (size_t i = 0; i < backtrace->NumFrames(); i++) { - LOG(ERROR) << backtrace->FormatFrameData(i); + for (const auto& frame : data.frames) { + LOG(ERROR) << unwinder.FormatFrame(frame); } if (init_fatal_panic) { LOG(ERROR) << __FUNCTION__ << ": Trigger crash"; diff --git a/libstats/socket_lazy/TEST_MAPPING b/libstats/socket_lazy/TEST_MAPPING index b182660b0..03506cda7 100644 --- a/libstats/socket_lazy/TEST_MAPPING +++ b/libstats/socket_lazy/TEST_MAPPING @@ -4,7 +4,7 @@ "name" : "libstatssocket_lazy_test" } ], - "hwasan-postsubmit" : [ + "hwasan-presubmit" : [ { "name" : "libstatssocket_lazy_test" } 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 <utils/Errors.h> #include <utils/Log.h> -#include <backtrace/Backtrace.h> +#include <unwindstack/AndroidUnwinder.h> #define CALLSTACK_WEAK // Don't generate weak definitions. #include <utils/CallStack.h> @@ -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(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<pid_t> tid_val; + if (tid != -1) { + *tid_val = tid; + } + if (!unwinder.Unwind(tid_val, data)) { + ALOGW("%s: Failed to unwind callstack: %s", __FUNCTION__, data.GetErrorString().c_str()); } - for (size_t i = 0; i < backtrace->NumFrames(); i++) { - mFrameLines.push_back(String8(backtrace->FormatFrameData(i).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 <memory> #include <android/log.h> -#include <backtrace/backtrace_constants.h> #include <utils/String8.h> #include <utils/Vector.h> @@ -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, diff --git a/libutils/include/utils/Thread.h b/libutils/include/utils/Thread.h index fc67656b4..5cf6b47a5 100644 --- a/libutils/include/utils/Thread.h +++ b/libutils/include/utils/Thread.h @@ -42,7 +42,9 @@ class Thread : virtual public RefBase { public: // Create a Thread object, but doesn't create or start the associated - // thread. See the run() method. + // thread. See the run() method. This object must be used with RefBase/sp, + // like any other RefBase object, because they are conventionally promoted + // from bare pointers (Thread::run is particularly problematic here). explicit Thread(bool canCallJava = true); virtual ~Thread(); diff --git a/rootdir/init.rc b/rootdir/init.rc index 2d6e22843..9983f6809 100644 --- a/rootdir/init.rc +++ b/rootdir/init.rc @@ -101,22 +101,18 @@ on property:apexd.status=ready && property:ro.product.cpu.abilist64=* exec_start boringssl_self_test_apex64 service boringssl_self_test32 /system/bin/boringssl_self_test32 - setenv BORINGSSL_SELF_TEST_CREATE_FLAG true # Any nonempty value counts as true reboot_on_failure reboot,boringssl-self-check-failed stdio_to_kmsg service boringssl_self_test64 /system/bin/boringssl_self_test64 - setenv BORINGSSL_SELF_TEST_CREATE_FLAG true # Any nonempty value counts as true reboot_on_failure reboot,boringssl-self-check-failed stdio_to_kmsg service boringssl_self_test_apex32 /apex/com.android.conscrypt/bin/boringssl_self_test32 - setenv BORINGSSL_SELF_TEST_CREATE_FLAG true # Any nonempty value counts as true reboot_on_failure reboot,boringssl-self-check-failed stdio_to_kmsg service boringssl_self_test_apex64 /apex/com.android.conscrypt/bin/boringssl_self_test64 - setenv BORINGSSL_SELF_TEST_CREATE_FLAG true # Any nonempty value counts as true reboot_on_failure reboot,boringssl-self-check-failed stdio_to_kmsg @@ -1135,10 +1131,6 @@ on boot chown system system /sys/devices/system/cpu/cpufreq/interactive/io_is_busy chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/io_is_busy - # Assume SMP uses shared cpufreq policy for all CPUs - chown system system /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq - chmod 0660 /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq - chown system system /sys/class/leds/vibrator/trigger chown system system /sys/class/leds/vibrator/activate chown system system /sys/class/leds/vibrator/brightness |