From bcaeacc6862be57f72ba1c51427214136c2e06df Mon Sep 17 00:00:00 2001 From: Christopher Ferris Date: Wed, 27 Mar 2024 16:17:50 -0700 Subject: [PATCH] Enable weak functions properly. There is a check for WEAKS_AVAILABLE that is never set. Change this so so it is available everywhere except apple/windows. Add new test to verify that on Android the logStackInternal function is defined. Bug: 331489939 Test: All unit tests pass. Change-Id: Ie982eba30ae421931a62718d39ff1f0c282453db --- libutils/CallStack.cpp | 5 +++-- libutils/CallStack_test.cpp | 41 +++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/libutils/CallStack.cpp b/libutils/CallStack.cpp index fe827eb0e..029f4a76e 100644 --- a/libutils/CallStack.cpp +++ b/libutils/CallStack.cpp @@ -89,7 +89,8 @@ void CallStack::print(Printer& printer) const { // The following four functions may be used via weak symbol references from libutils. // Clients assume that if any of these symbols are available, then deleteStack() is. -#ifdef WEAKS_AVAILABLE +// Apple and Windows does not support this, so only compile on other platforms. +#if !defined(__APPLE__) && !defined(_WIN32) CallStack::CallStackUPtr CallStack::getCurrentInternal(int ignoreDepth) { CallStack::CallStackUPtr stack(new CallStack()); @@ -110,6 +111,6 @@ void CallStack::deleteStack(CallStack* stack) { delete stack; } -#endif // WEAKS_AVAILABLE +#endif // !defined(__APPLE__) && !defined(_WIN32) }; // namespace android diff --git a/libutils/CallStack_test.cpp b/libutils/CallStack_test.cpp index 2cfaf6127..7afc2c333 100644 --- a/libutils/CallStack_test.cpp +++ b/libutils/CallStack_test.cpp @@ -18,10 +18,16 @@ #include +#include #include #include #include +#if defined(__ANDROID__) +#include +#include +#endif + __attribute__((__noinline__)) extern "C" void CurrentCaller(android::String8& backtrace) { android::CallStack cs; cs.update(); @@ -61,3 +67,38 @@ TEST(CallStackTest, thread_backtrace) { ASSERT_NE(-1, cs.toString().find("(ThreadBusyWait")) << "Full backtrace:\n" << cs.toString(); } + +#if defined(__ANDROID__) +TEST(CallStackTest, log_stack) { + android::CallStack::logStack("callstack_test"); + auto logger_list = android_logger_list_open(android_name_to_log_id("main"), + ANDROID_LOG_NONBLOCK, 1000, getpid()); + ASSERT_NE(nullptr, logger_list); + std::string log; + while (true) { + log_msg log_msg; + auto ret = android_logger_list_read(logger_list, &log_msg); + if (ret == -EAGAIN) { + break; + } + ASSERT_GT(ret, 0); + if (log_msg.msg() == nullptr) { + continue; + } + // First get the tag. + char* msg = &log_msg.msg()[1]; + if (std::string(msg) != "callstack_test") { + continue; + } + // Now move past the tag. + msg = &msg[strlen(msg) + 1]; + log += msg; + log += '\n'; + } + ASSERT_NE("", log) << "No messages found in the log from the test."; + // Look for a backtrace line such as: + // #00 pc 00000000000536e4 libutils_test (testing::Test::Run()+436) + ASSERT_MATCH(log, "#\\d+ pc \\d+"); + android_logger_list_close(logger_list); +} +#endif