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