1 /*
2 * Copyright (c) 2022 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
18 #include <cstdio>
19 #include <thread>
20 #include <unistd.h>
21 #include <malloc.h>
22 #include <securec.h>
23 #include "dfx_instr_statistic.h"
24 #include "dfx_ptrace.h"
25 #include "dfx_regs_get.h"
26 #include "procinfo.h"
27 #include "unwinder.h"
28
29 using namespace testing;
30 using namespace testing::ext;
31
32 namespace OHOS {
33 namespace HiviewDFX {
34 #undef LOG_DOMAIN
35 #undef LOG_TAG
36 #define LOG_TAG "DfxInstrStatisticTest"
37 #define LOG_DOMAIN 0xD002D11
38
39 class InstrStatisticTest : public testing::Test {
40 public:
SetUpTestCase()41 static void SetUpTestCase() {}
TearDownTestCase()42 static void TearDownTestCase() {}
SetUp()43 void SetUp() {}
TearDown()44 void TearDown() {}
45 };
46
47 /**
48 * @tc.name: InstrStatisticTest001
49 * @tc.desc: test InstrStatistic interface
50 * @tc.type: FUNC
51 */
HWTEST_F(InstrStatisticTest, InstrStatisticTest001, TestSize.Level2)52 HWTEST_F(InstrStatisticTest, InstrStatisticTest001, TestSize.Level2)
53 {
54 GTEST_LOG_(INFO) << "InstrStatisticTest001: start.";
55 static pid_t pid = getpid();
56 static std::string elfName;
57 ReadProcessName(pid, elfName);
58 pid_t child = fork();
59 if (child == 0) {
60 GTEST_LOG_(INFO) << "elfName: " << elfName;
61 DfxInstrStatistic::GetInstance().SetCurrentStatLib(elfName);
62 GTEST_LOG_(INFO) << "pid: " << pid << ", ppid:" << getppid();
63 auto unwinder = std::make_shared<Unwinder>(pid);
64 bool unwRet = DfxPtrace::Attach(pid);
65 EXPECT_EQ(true, unwRet) << "InstrStatisticTest001: Attach:" << unwRet;
66 auto regs = DfxRegs::CreateRemoteRegs(pid);
67 unwinder->SetRegs(regs);
68 auto maps = DfxMaps::Create(pid);
69 UnwindContext context;
70 context.pid = pid;
71 context.regs = regs;
72 context.maps = maps;
73 unwRet = unwinder->Unwind(&context);
74 EXPECT_EQ(true, unwRet) << "InstrStatisticTest001: Unwind:" << unwRet;
75 auto frames = unwinder->GetFrames();
76 ASSERT_GT(frames.size(), 1);
77 GTEST_LOG_(INFO) << "frames:\n" << Unwinder::GetFramesStr(frames);
78 DfxPtrace::Detach(pid);
79 std::vector<std::pair<uint32_t, uint32_t>> result;
80 DfxInstrStatistic::GetInstance().DumpInstrStatResult(result);
81 ASSERT_GT(result.size(), 0);
82 for (size_t i = 0; i < result.size(); ++i) {
83 GTEST_LOG_(INFO) << result[i].first << result[i].second;
84 }
85 _exit(0);
86 }
87
88 int status;
89 int ret = wait(&status);
90 ASSERT_EQ(status, 0);
91 GTEST_LOG_(INFO) << "Status:" << status << " Result:" << ret;
92 GTEST_LOG_(INFO) << "InstrStatisticTest001: end.";
93 }
94 } // namespace HiviewDFX
95 } // namepsace OHOS