1800b99b8Sopenharmony_ci/*
2800b99b8Sopenharmony_ci * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3800b99b8Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4800b99b8Sopenharmony_ci * you may not use this file except in compliance with the License.
5800b99b8Sopenharmony_ci * You may obtain a copy of the License at
6800b99b8Sopenharmony_ci *
7800b99b8Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8800b99b8Sopenharmony_ci *
9800b99b8Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10800b99b8Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11800b99b8Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12800b99b8Sopenharmony_ci * See the License for the specific language governing permissions and
13800b99b8Sopenharmony_ci * limitations under the License.
14800b99b8Sopenharmony_ci */
15800b99b8Sopenharmony_ci
16800b99b8Sopenharmony_ci#ifndef DFX_CRASHER_H
17800b99b8Sopenharmony_ci#define DFX_CRASHER_H
18800b99b8Sopenharmony_ci
19800b99b8Sopenharmony_ci#include <cinttypes>
20800b99b8Sopenharmony_ci#include <string>
21800b99b8Sopenharmony_ci
22800b99b8Sopenharmony_ci#define NOINLINE __attribute__((noinline))
23800b99b8Sopenharmony_ci
24800b99b8Sopenharmony_ci#define GEN_TEST_FUNCTION(FuncNumA, FuncNumB)          \
25800b99b8Sopenharmony_ci    __attribute__((noinline)) int TestFunc##FuncNumA() \
26800b99b8Sopenharmony_ci    {                                                  \
27800b99b8Sopenharmony_ci        return TestFunc##FuncNumB();                   \
28800b99b8Sopenharmony_ci    }
29800b99b8Sopenharmony_ci
30800b99b8Sopenharmony_ciclass DfxCrasher {
31800b99b8Sopenharmony_cipublic:
32800b99b8Sopenharmony_ci
33800b99b8Sopenharmony_ci    static DfxCrasher &GetInstance();
34800b99b8Sopenharmony_ci    ~DfxCrasher();
35800b99b8Sopenharmony_ci
36800b99b8Sopenharmony_ci    static int RaiseAbort();
37800b99b8Sopenharmony_ci    static int RaiseBusError();
38800b99b8Sopenharmony_ci    static int RaiseFloatingPointException();
39800b99b8Sopenharmony_ci    static int RaiseIllegalInstructionException();
40800b99b8Sopenharmony_ci    static int RaiseSegmentFaultException();
41800b99b8Sopenharmony_ci    static int RaiseTrapException();
42800b99b8Sopenharmony_ci    static int IllegalInstructionException();
43800b99b8Sopenharmony_ci    static int SegmentFaultException();
44800b99b8Sopenharmony_ci    static int Abort();
45800b99b8Sopenharmony_ci    static int Loop();
46800b99b8Sopenharmony_ci
47800b99b8Sopenharmony_ci    void PrintUsage() const;
48800b99b8Sopenharmony_ci
49800b99b8Sopenharmony_ci    static void* DoCrashInThread(void* inputArg);
50800b99b8Sopenharmony_ci    uint64_t DoActionOnSubThread(const char* arg) const;
51800b99b8Sopenharmony_ci    uint64_t ParseAndDoCrash(const char* arg) const;
52800b99b8Sopenharmony_ci    static int MaxStackDepth();
53800b99b8Sopenharmony_ci    static int MultiThreadCrash();
54800b99b8Sopenharmony_ci    static int ProgramCounterZero();
55800b99b8Sopenharmony_ci    static int StackOver64();
56800b99b8Sopenharmony_ci    static int StackTop();
57800b99b8Sopenharmony_ci    //           1         2         3         4         5         6         7
58800b99b8Sopenharmony_ci    //  1234567890123456789012345678901234567890123456789012345678901234567890
59800b99b8Sopenharmony_ci    static int MaxMethodNameTest12345678901234567890123456789012345678901234567890ABC();
60800b99b8Sopenharmony_ci    static int TriggerSegmentFaultException();
61800b99b8Sopenharmony_ci    static int StackOverflow();
62800b99b8Sopenharmony_ci    static int Oom();
63800b99b8Sopenharmony_ci    static int TriggerTrapException();
64800b99b8Sopenharmony_ci    static int CrashInLambda();
65800b99b8Sopenharmony_ci    static int DoDumpCrash();
66800b99b8Sopenharmony_ci    static int TestExitHook();
67800b99b8Sopenharmony_ci    static int TestSigHook();
68800b99b8Sopenharmony_ci    static int StackCorruption();
69800b99b8Sopenharmony_ci    static int StackCorruption2();
70800b99b8Sopenharmony_ci
71800b99b8Sopenharmony_ci    static int RecursiveFunc(int curLevel, int targetLevel, int midLevel);
72800b99b8Sopenharmony_ci    static int PrintFatalMessageInLibc();
73800b99b8Sopenharmony_ci    static int TestGetCrashObj();
74800b99b8Sopenharmony_ci#ifndef is_ohos_lite
75800b99b8Sopenharmony_ci    static int AsyncStacktrace();
76800b99b8Sopenharmony_ci    static int CrashInFFRT(const std::string &debug);
77800b99b8Sopenharmony_ci    static int CrashInLibuvWork(const std::string &debug);
78800b99b8Sopenharmony_ci    static int CrashInLibuvTimer(const std::string &debug);
79800b99b8Sopenharmony_ci    static int CrashInLibuvWorkDone(const std::string &debug);
80800b99b8Sopenharmony_ci#endif
81800b99b8Sopenharmony_ci    static int TestDeadlock();
82800b99b8Sopenharmony_ci
83800b99b8Sopenharmony_ciprivate:
84800b99b8Sopenharmony_ci    DfxCrasher();
85800b99b8Sopenharmony_ci    DfxCrasher(const DfxCrasher &) = delete;
86800b99b8Sopenharmony_ci    DfxCrasher &operator=(const DfxCrasher &) = delete;
87800b99b8Sopenharmony_ci};
88800b99b8Sopenharmony_ciint SleepThread(int threadID);
89800b99b8Sopenharmony_ci// test functions for callstack depth test
90800b99b8Sopenharmony_ciint TestFunc0(void);
91800b99b8Sopenharmony_ciint TestFunc1(void);
92800b99b8Sopenharmony_ciint TestFunc2(void);
93800b99b8Sopenharmony_ciint TestFunc3(void);
94800b99b8Sopenharmony_ciint TestFunc4(void);
95800b99b8Sopenharmony_ciint TestFunc5(void);
96800b99b8Sopenharmony_ciint TestFunc6(void);
97800b99b8Sopenharmony_ciint TestFunc7(void);
98800b99b8Sopenharmony_ciint TestFunc8(void);
99800b99b8Sopenharmony_ciint TestFunc9(void);
100800b99b8Sopenharmony_ciint TestFunc10(void);
101800b99b8Sopenharmony_ciint TestFunc11(void);
102800b99b8Sopenharmony_ciint TestFunc12(void);
103800b99b8Sopenharmony_ciint TestFunc13(void);
104800b99b8Sopenharmony_ciint TestFunc14(void);
105800b99b8Sopenharmony_ciint TestFunc15(void);
106800b99b8Sopenharmony_ciint TestFunc16(void);
107800b99b8Sopenharmony_ciint TestFunc17(void);
108800b99b8Sopenharmony_ciint TestFunc18(void);
109800b99b8Sopenharmony_ciint TestFunc19(void);
110800b99b8Sopenharmony_ciint TestFunc20(void);
111800b99b8Sopenharmony_ciint TestFunc21(void);
112800b99b8Sopenharmony_ciint TestFunc22(void);
113800b99b8Sopenharmony_ciint TestFunc23(void);
114800b99b8Sopenharmony_ciint TestFunc24(void);
115800b99b8Sopenharmony_ciint TestFunc25(void);
116800b99b8Sopenharmony_ciint TestFunc26(void);
117800b99b8Sopenharmony_ciint TestFunc27(void);
118800b99b8Sopenharmony_ciint TestFunc28(void);
119800b99b8Sopenharmony_ciint TestFunc29(void);
120800b99b8Sopenharmony_ciint TestFunc30(void);
121800b99b8Sopenharmony_ciint TestFunc31(void);
122800b99b8Sopenharmony_ciint TestFunc32(void);
123800b99b8Sopenharmony_ciint TestFunc33(void);
124800b99b8Sopenharmony_ciint TestFunc34(void);
125800b99b8Sopenharmony_ciint TestFunc35(void);
126800b99b8Sopenharmony_ciint TestFunc36(void);
127800b99b8Sopenharmony_ciint TestFunc37(void);
128800b99b8Sopenharmony_ciint TestFunc38(void);
129800b99b8Sopenharmony_ciint TestFunc39(void);
130800b99b8Sopenharmony_ciint TestFunc40(void);
131800b99b8Sopenharmony_ciint TestFunc41(void);
132800b99b8Sopenharmony_ciint TestFunc42(void);
133800b99b8Sopenharmony_ciint TestFunc43(void);
134800b99b8Sopenharmony_ciint TestFunc44(void);
135800b99b8Sopenharmony_ciint TestFunc45(void);
136800b99b8Sopenharmony_ciint TestFunc46(void);
137800b99b8Sopenharmony_ciint TestFunc47(void);
138800b99b8Sopenharmony_ciint TestFunc48(void);
139800b99b8Sopenharmony_ciint TestFunc49(void);
140800b99b8Sopenharmony_ciint TestFunc50(void);
141800b99b8Sopenharmony_ciint TestFunc51(void);
142800b99b8Sopenharmony_ciint TestFunc52(void);
143800b99b8Sopenharmony_ciint TestFunc53(void);
144800b99b8Sopenharmony_ciint TestFunc54(void);
145800b99b8Sopenharmony_ciint TestFunc55(void);
146800b99b8Sopenharmony_ciint TestFunc56(void);
147800b99b8Sopenharmony_ciint TestFunc57(void);
148800b99b8Sopenharmony_ciint TestFunc58(void);
149800b99b8Sopenharmony_ciint TestFunc59(void);
150800b99b8Sopenharmony_ciint TestFunc60(void);
151800b99b8Sopenharmony_ciint TestFunc61(void);
152800b99b8Sopenharmony_ciint TestFunc62(void);
153800b99b8Sopenharmony_ciint TestFunc63(void);
154800b99b8Sopenharmony_ciint TestFunc64(void);
155800b99b8Sopenharmony_ciint TestFunc65(void);
156800b99b8Sopenharmony_ciint TestFunc66(void);
157800b99b8Sopenharmony_ciint TestFunc67(void);
158800b99b8Sopenharmony_ciint TestFunc68(void);
159800b99b8Sopenharmony_ciint TestFunc69(void);
160800b99b8Sopenharmony_ciint TestFunc70(void);
161800b99b8Sopenharmony_ci
162800b99b8Sopenharmony_ci#endif // DFX_CRASHER_H
163