Loading libutils/CallStack.cpp +3 −2 Original line number Diff line number Diff line Loading @@ -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()); Loading @@ -110,6 +111,6 @@ void CallStack::deleteStack(CallStack* stack) { delete stack; } #endif // WEAKS_AVAILABLE #endif // !defined(__APPLE__) && !defined(_WIN32) }; // namespace android libutils/CallStack_test.cpp +41 −0 Original line number Diff line number Diff line Loading @@ -18,10 +18,16 @@ #include <thread> #include <android-base/test_utils.h> #include <android-base/threads.h> #include <gtest/gtest.h> #include <utils/CallStack.h> #if defined(__ANDROID__) #include <log/log.h> #include <log/log_read.h> #endif __attribute__((__noinline__)) extern "C" void CurrentCaller(android::String8& backtrace) { android::CallStack cs; cs.update(); Loading Loading @@ -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 Loading
libutils/CallStack.cpp +3 −2 Original line number Diff line number Diff line Loading @@ -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()); Loading @@ -110,6 +111,6 @@ void CallStack::deleteStack(CallStack* stack) { delete stack; } #endif // WEAKS_AVAILABLE #endif // !defined(__APPLE__) && !defined(_WIN32) }; // namespace android
libutils/CallStack_test.cpp +41 −0 Original line number Diff line number Diff line Loading @@ -18,10 +18,16 @@ #include <thread> #include <android-base/test_utils.h> #include <android-base/threads.h> #include <gtest/gtest.h> #include <utils/CallStack.h> #if defined(__ANDROID__) #include <log/log.h> #include <log/log_read.h> #endif __attribute__((__noinline__)) extern "C" void CurrentCaller(android::String8& backtrace) { android::CallStack cs; cs.update(); Loading Loading @@ -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