1 /* 2 * Copyright (c) 2022-2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #include <gtest/gtest.h> 17 #include <securec.h> 18 19 #include "ffrt_inner.h" 20 #include "fp_backtrace.h" 21 22 using namespace testing; 23 using namespace testing::ext; 24 25 namespace OHOS { 26 namespace HiviewDFX { 27 28 #define DEFAULT_MAX_FRAME_NUM 256 29 #define MIN_FRAME_NUM 2 30 31 class FpBacktraceTest : public testing::Test {}; 32 33 /** 34 * @tc.name: FpBacktraceTestTest001 35 * @tc.desc: test get backtrace of current thread by fp 36 * @tc.type: FUNC 37 */ 38 HWTEST_F(FpBacktraceTest, FpBacktraceTestTest001, TestSize.Level2) 39 { 40 GTEST_LOG_(INFO) << "BacktraceLocalTest001: start."; 41 auto fpBacktrace = FpBacktrace::CreateInstance(); 42 #if is_ohos && !is_mingw && __aarch64__ 43 ASSERT_NE(nullptr, fpBacktrace); 44 void* pcArray[DEFAULT_MAX_FRAME_NUM]{0}; 45 int size = fpBacktrace->BacktraceFromFp(__builtin_frame_address(0), pcArray, DEFAULT_MAX_FRAME_NUM); 46 ASSERT_GE(size, 0); 47 for (int i = 0; i < size; i++) { 48 ASSERT_NE(fpBacktrace->SymbolicAddress(pcArray[i]), nullptr); 49 } 50 for (int i = 0; i < size; i++) { 51 ASSERT_NE(fpBacktrace->SymbolicAddress(pcArray[i]), nullptr); 52 } 53 #else 54 ASSERT_EQ(nullptr, fpBacktrace); 55 #endif 56 GTEST_LOG_(INFO) << "BacktraceLocalTest001: end."; 57 } 58 59 #if is_ohos && !is_mingw && __aarch64__ 60 /** 61 * @tc.name: FpBacktraceTestTest002 62 * @tc.desc: test get backtrace by a invalid parameter. 63 * @tc.type: FUNC 64 */ 65 HWTEST_F(FpBacktraceTest, FpBacktraceTestTest002, TestSize.Level2) 66 { 67 GTEST_LOG_(INFO) << "BacktraceLocalTest002: start."; 68 auto fpBacktrace = FpBacktrace::CreateInstance(); 69 ASSERT_NE(nullptr, fpBacktrace); 70 void* pcArray[DEFAULT_MAX_FRAME_NUM]{0}; 71 uint64_t address = std::numeric_limits<uint64_t>::max(); 72 ASSERT_EQ(fpBacktrace->BacktraceFromFp(nullptr, nullptr, 0), 0); 73 ASSERT_EQ(fpBacktrace->BacktraceFromFp(reinterpret_cast<void*>(address), nullptr, 0), 0); 74 ASSERT_EQ(fpBacktrace->BacktraceFromFp(reinterpret_cast<void*>(address), pcArray, 0), 0); 75 ASSERT_EQ(fpBacktrace->BacktraceFromFp(reinterpret_cast<void*>(address), pcArray, DEFAULT_MAX_FRAME_NUM), 0); 76 GTEST_LOG_(INFO) << "BacktraceLocalTest002: end."; 77 } 78 79 /** 80 * @tc.name: FpBacktraceTestTest003 81 * @tc.desc: test get backtrace for ffrt thread. 82 * @tc.type: FUNC 83 */ 84 HWTEST_F(FpBacktraceTest, FpBacktraceTestTest003, TestSize.Level2) 85 { 86 GTEST_LOG_(INFO) << "BacktraceLocalTest003: start."; 87 auto fpBacktrace = FpBacktrace::CreateInstance(); 88 ASSERT_NE(nullptr, fpBacktrace); 89 int size = 0; __anonf94e6af30102null90 ffrt::submit([&] { 91 void* pcArray[DEFAULT_MAX_FRAME_NUM]{0}; 92 size = fpBacktrace->BacktraceFromFp(__builtin_frame_address(0), pcArray, DEFAULT_MAX_FRAME_NUM); 93 }, {}, {}); 94 ffrt::wait(); 95 ASSERT_GT(size, 0); 96 GTEST_LOG_(INFO) << "BacktraceLocalTest003: end."; 97 } 98 99 /** 100 * @tc.name: FpBacktraceTestTest004 101 * @tc.desc: test get backtrace for other thread. 102 * @tc.type: FUNC 103 */ 104 HWTEST_F(FpBacktraceTest, FpBacktraceTestTest004, TestSize.Level2) 105 { 106 GTEST_LOG_(INFO) << "BacktraceLocalTest004: start."; 107 auto fpBacktrace = FpBacktrace::CreateInstance(); 108 ASSERT_NE(nullptr, fpBacktrace); 109 int size = 0; 110 auto startFp = __builtin_frame_address(0); __anonf94e6af30202null111 ffrt::submit([&] { 112 void* pcArray[DEFAULT_MAX_FRAME_NUM]{0}; 113 size = fpBacktrace->BacktraceFromFp(startFp, pcArray, DEFAULT_MAX_FRAME_NUM); 114 }, {}, {}); 115 ffrt::wait(); 116 ASSERT_GT(size, 0); 117 GTEST_LOG_(INFO) << "BacktraceLocalTest004: end."; 118 } 119 #endif 120 } // namespace HiviewDFX 121 } // namepsace OHOS 122