1800b99b8Sopenharmony_ci/* 2800b99b8Sopenharmony_ci * Copyright (c) 2021 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#include "dfx_crasher.h" 17800b99b8Sopenharmony_ci 18800b99b8Sopenharmony_ci#include <pthread.h> 19800b99b8Sopenharmony_ci#include <signal.h> 20800b99b8Sopenharmony_ci#include <sys/mman.h> 21800b99b8Sopenharmony_ci#include <sys/prctl.h> 22800b99b8Sopenharmony_ci#include <sys/resource.h> 23800b99b8Sopenharmony_ci#include <unistd.h> 24800b99b8Sopenharmony_ci#include "errno.h" 25800b99b8Sopenharmony_ci#include "hilog/log.h" 26800b99b8Sopenharmony_ci#include "inttypes.h" 27800b99b8Sopenharmony_ci#include "stdio.h" 28800b99b8Sopenharmony_ci#include "stdlib.h" 29800b99b8Sopenharmony_ci#include "string.h" 30800b99b8Sopenharmony_ci#include "strings.h" 31800b99b8Sopenharmony_ci#include "dfx_define.h" 32800b99b8Sopenharmony_ci 33800b99b8Sopenharmony_ci#ifdef LOG_DOMAIN 34800b99b8Sopenharmony_ci#undef LOG_DOMAIN 35800b99b8Sopenharmony_ci#define LOG_DOMAIN 0xD002D11 36800b99b8Sopenharmony_ci#endif 37800b99b8Sopenharmony_ci 38800b99b8Sopenharmony_ci#ifdef LOG_TAG 39800b99b8Sopenharmony_ci#undef LOG_TAG 40800b99b8Sopenharmony_ci#define LOG_TAG "Unwind" 41800b99b8Sopenharmony_ci#endif 42800b99b8Sopenharmony_ci 43800b99b8Sopenharmony_cistatic const int ARG1024 = 1024; 44800b99b8Sopenharmony_cistatic const int ARG128 = 128; 45800b99b8Sopenharmony_ci 46800b99b8Sopenharmony_ciNOINLINE int TriggerTrapException(void) 47800b99b8Sopenharmony_ci{ 48800b99b8Sopenharmony_ci#ifndef __x86_64__ 49800b99b8Sopenharmony_ci __asm__ volatile(".inst 0xde01"); 50800b99b8Sopenharmony_ci#endif 51800b99b8Sopenharmony_ci return 0; 52800b99b8Sopenharmony_ci} 53800b99b8Sopenharmony_ci 54800b99b8Sopenharmony_ciNOINLINE int RaiseAbort(void) 55800b99b8Sopenharmony_ci{ 56800b99b8Sopenharmony_ci HILOG_FATAL(LOG_CORE, "Test Trigger ABORT!"); 57800b99b8Sopenharmony_ci int ret = raise(SIGABRT); 58800b99b8Sopenharmony_ci if (ret != 0) { 59800b99b8Sopenharmony_ci printf("raise failed!"); 60800b99b8Sopenharmony_ci } 61800b99b8Sopenharmony_ci return 0; 62800b99b8Sopenharmony_ci} 63800b99b8Sopenharmony_ciNOINLINE int Abort(void) 64800b99b8Sopenharmony_ci{ 65800b99b8Sopenharmony_ci HILOG_FATAL(LOG_CORE, "Test Trigger ABORT!"); 66800b99b8Sopenharmony_ci abort(); 67800b99b8Sopenharmony_ci return 0; 68800b99b8Sopenharmony_ci} 69800b99b8Sopenharmony_ci 70800b99b8Sopenharmony_ciNOINLINE int RaiseBusError(void) 71800b99b8Sopenharmony_ci{ 72800b99b8Sopenharmony_ci int ret = raise(SIGBUS); 73800b99b8Sopenharmony_ci if (ret != 0) { 74800b99b8Sopenharmony_ci printf("remove failed!"); 75800b99b8Sopenharmony_ci } 76800b99b8Sopenharmony_ci return 0; 77800b99b8Sopenharmony_ci} 78800b99b8Sopenharmony_ci 79800b99b8Sopenharmony_ciNOINLINE int RaiseFloatingPointException(void) 80800b99b8Sopenharmony_ci{ 81800b99b8Sopenharmony_ci int ret = raise(SIGFPE); 82800b99b8Sopenharmony_ci if (ret != 0) { 83800b99b8Sopenharmony_ci printf("remove failed!"); 84800b99b8Sopenharmony_ci } 85800b99b8Sopenharmony_ci return 0; 86800b99b8Sopenharmony_ci} 87800b99b8Sopenharmony_ci 88800b99b8Sopenharmony_ciNOINLINE int RaiseIllegalInstructionException(void) 89800b99b8Sopenharmony_ci{ 90800b99b8Sopenharmony_ci int ret = raise(SIGILL); 91800b99b8Sopenharmony_ci if (ret != 0) { 92800b99b8Sopenharmony_ci printf("ramove failed!"); 93800b99b8Sopenharmony_ci } 94800b99b8Sopenharmony_ci return 0; 95800b99b8Sopenharmony_ci} 96800b99b8Sopenharmony_ci 97800b99b8Sopenharmony_ciNOINLINE int IllegalInstructionException(void) 98800b99b8Sopenharmony_ci{ 99800b99b8Sopenharmony_ci#if defined(__aarch64__) 100800b99b8Sopenharmony_ci __asm__ volatile(".word 0\n"); 101800b99b8Sopenharmony_ci#elif defined(__arm__) 102800b99b8Sopenharmony_ci __asm__ volatile(".word 0xe7f0def0\n"); 103800b99b8Sopenharmony_ci#elif defined(__x86_64__) 104800b99b8Sopenharmony_ci __asm__ volatile("ud2\n"); 105800b99b8Sopenharmony_ci#else 106800b99b8Sopenharmony_ci#error 107800b99b8Sopenharmony_ci#endif 108800b99b8Sopenharmony_ci return 0; 109800b99b8Sopenharmony_ci} 110800b99b8Sopenharmony_ci 111800b99b8Sopenharmony_ciNOINLINE int RaiseSegmentFaultException(void) 112800b99b8Sopenharmony_ci{ 113800b99b8Sopenharmony_ci printf("call RaiseSegmentFaultException \n"); 114800b99b8Sopenharmony_ci int ret = raise(SIGSEGV); 115800b99b8Sopenharmony_ci if (ret != 0) { 116800b99b8Sopenharmony_ci printf("remove failed!"); 117800b99b8Sopenharmony_ci } 118800b99b8Sopenharmony_ci return 0; 119800b99b8Sopenharmony_ci} 120800b99b8Sopenharmony_ci 121800b99b8Sopenharmony_ciNOINLINE int SegmentFaultException(void) 122800b99b8Sopenharmony_ci{ 123800b99b8Sopenharmony_ci volatile char *ptr = NULL; 124800b99b8Sopenharmony_ci *ptr; 125800b99b8Sopenharmony_ci 126800b99b8Sopenharmony_ci return 0; 127800b99b8Sopenharmony_ci} 128800b99b8Sopenharmony_ci 129800b99b8Sopenharmony_ciNOINLINE int RaiseTrapException(void) 130800b99b8Sopenharmony_ci{ 131800b99b8Sopenharmony_ci int ret = raise(SIGTRAP); 132800b99b8Sopenharmony_ci if (ret != 0) { 133800b99b8Sopenharmony_ci printf("remove failed!"); 134800b99b8Sopenharmony_ci } 135800b99b8Sopenharmony_ci return 0; 136800b99b8Sopenharmony_ci} 137800b99b8Sopenharmony_ci 138800b99b8Sopenharmony_ciNOINLINE int TrapException(void) 139800b99b8Sopenharmony_ci{ 140800b99b8Sopenharmony_ci return 0; 141800b99b8Sopenharmony_ci} 142800b99b8Sopenharmony_ci 143800b99b8Sopenharmony_ciNOINLINE int MaxStackDepth(void) 144800b99b8Sopenharmony_ci{ 145800b99b8Sopenharmony_ci return TestFunc1(); 146800b99b8Sopenharmony_ci} 147800b99b8Sopenharmony_ci 148800b99b8Sopenharmony_ciNOINLINE int MaxMethodNameTest12345678901234567890123456789012345678901234567890ABC(void) 149800b99b8Sopenharmony_ci{ 150800b99b8Sopenharmony_ci printf("call MaxMethodNameTest12345678901234567890123456789012345678901234567890ABC \n"); 151800b99b8Sopenharmony_ci int ret = raise(SIGSEGV); 152800b99b8Sopenharmony_ci if (ret != 0) { 153800b99b8Sopenharmony_ci printf("remove failed!"); 154800b99b8Sopenharmony_ci } 155800b99b8Sopenharmony_ci return 0; 156800b99b8Sopenharmony_ci} 157800b99b8Sopenharmony_ci 158800b99b8Sopenharmony_ciNOINLINE int StackOverflow(void) 159800b99b8Sopenharmony_ci{ 160800b99b8Sopenharmony_ci printf("call StackOverflow\n"); 161800b99b8Sopenharmony_ci 162800b99b8Sopenharmony_ci // for stack overflow test 163800b99b8Sopenharmony_ci char a[1024][1024][1024] = { { {'1'} } }; 164800b99b8Sopenharmony_ci char b[1024][1024][1024] = { { {'1'} } }; 165800b99b8Sopenharmony_ci char c[1024][1024][1024] = { { {'1'} } }; 166800b99b8Sopenharmony_ci char d[1024][1024][1024] = { { {'1'} } }; 167800b99b8Sopenharmony_ci printf("a[0][0] is %s\n", a[0][0]); 168800b99b8Sopenharmony_ci printf("b[0][0] is %s\n", b[0][0]); 169800b99b8Sopenharmony_ci printf("c[0][0] is %s\n", c[0][0]); 170800b99b8Sopenharmony_ci printf("d[0][0] is %s\n", d[0][0]); 171800b99b8Sopenharmony_ci 172800b99b8Sopenharmony_ci return 0; 173800b99b8Sopenharmony_ci} 174800b99b8Sopenharmony_ci 175800b99b8Sopenharmony_ciNOINLINE int Oom(void) 176800b99b8Sopenharmony_ci{ 177800b99b8Sopenharmony_ci struct rlimit oldRlimit; 178800b99b8Sopenharmony_ci if (getrlimit(RLIMIT_AS, &oldRlimit) != 0) { 179800b99b8Sopenharmony_ci printf("getrlimit failed\n"); 180800b99b8Sopenharmony_ci raise(SIGINT); 181800b99b8Sopenharmony_ci } 182800b99b8Sopenharmony_ci printf("old rlimit, cur:0x%016" PRIx64 " max:0x%016" PRIx64 "\n", 183800b99b8Sopenharmony_ci (uint64_t)oldRlimit.rlim_cur, (uint64_t)oldRlimit.rlim_max); 184800b99b8Sopenharmony_ci 185800b99b8Sopenharmony_ci struct rlimit rlim = { 186800b99b8Sopenharmony_ci .rlim_cur = (ARG128 - 1) * ARG1024 * ARG1024, 187800b99b8Sopenharmony_ci .rlim_max = (ARG128 - 1) * ARG1024 * ARG1024, 188800b99b8Sopenharmony_ci }; 189800b99b8Sopenharmony_ci 190800b99b8Sopenharmony_ci if (setrlimit(RLIMIT_AS, &rlim) != 0) { 191800b99b8Sopenharmony_ci printf("setrlimit failed\n"); 192800b99b8Sopenharmony_ci raise(SIGINT); 193800b99b8Sopenharmony_ci } 194800b99b8Sopenharmony_ci char* bufferArray[ARG128]; 195800b99b8Sopenharmony_ci for (int i = 0; i < ARG128; i++) { 196800b99b8Sopenharmony_ci char* buf = (char*)mmap(NULL, (ARG1024 * ARG1024), PROT_READ | PROT_WRITE, 197800b99b8Sopenharmony_ci MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); 198800b99b8Sopenharmony_ci if (buf == (char*)MAP_FAILED) { 199800b99b8Sopenharmony_ci printf("malloc return null\n"); 200800b99b8Sopenharmony_ci if (setrlimit(RLIMIT_AS, &oldRlimit) != 0) { 201800b99b8Sopenharmony_ci printf("restore rlimit failed\n"); 202800b99b8Sopenharmony_ci } 203800b99b8Sopenharmony_ci printf("restore rlimit ok\n"); 204800b99b8Sopenharmony_ci abort(); 205800b99b8Sopenharmony_ci } 206800b99b8Sopenharmony_ci bufferArray[i] = buf; 207800b99b8Sopenharmony_ci } 208800b99b8Sopenharmony_ci for (int i = 0; i < ARG128; i++) { 209800b99b8Sopenharmony_ci printf("0x%x", *(bufferArray[i] + 1)); 210800b99b8Sopenharmony_ci } 211800b99b8Sopenharmony_ci 212800b99b8Sopenharmony_ci return 0; 213800b99b8Sopenharmony_ci} 214800b99b8Sopenharmony_ci 215800b99b8Sopenharmony_cistatic NOINLINE int ProgramCounterZero(void) 216800b99b8Sopenharmony_ci{ 217800b99b8Sopenharmony_ci printf("test PCZero"); 218800b99b8Sopenharmony_ci#if defined(__arm__) 219800b99b8Sopenharmony_ci __asm__ volatile ( 220800b99b8Sopenharmony_ci "mov r0, #0x00\n mov lr, pc\n bx r0\n" 221800b99b8Sopenharmony_ci ); 222800b99b8Sopenharmony_ci#elif defined(__aarch64__) 223800b99b8Sopenharmony_ci __asm__ volatile ( 224800b99b8Sopenharmony_ci "movz x0, #0x0\n" 225800b99b8Sopenharmony_ci "adr x30, .\n" 226800b99b8Sopenharmony_ci "br x0\n" 227800b99b8Sopenharmony_ci ); 228800b99b8Sopenharmony_ci#endif 229800b99b8Sopenharmony_ci return 0; 230800b99b8Sopenharmony_ci} 231800b99b8Sopenharmony_ci 232800b99b8Sopenharmony_ciNOINLINE int MultiThreadCrash(void) 233800b99b8Sopenharmony_ci{ 234800b99b8Sopenharmony_ci printf("test MultiThreadCrash"); 235800b99b8Sopenharmony_ci 236800b99b8Sopenharmony_ci pthread_t t[2]; 237800b99b8Sopenharmony_ci int threadID[2] = {1, 2}; 238800b99b8Sopenharmony_ci pthread_create(&t[0], NULL, SleepThread, &threadID[0]); 239800b99b8Sopenharmony_ci pthread_create(&t[1], NULL, SleepThread, &threadID[1]); 240800b99b8Sopenharmony_ci pthread_detach(t[0]); 241800b99b8Sopenharmony_ci pthread_detach(t[1]); 242800b99b8Sopenharmony_ci sleep(1); 243800b99b8Sopenharmony_ci 244800b99b8Sopenharmony_ci int ret = raise(SIGSEGV); 245800b99b8Sopenharmony_ci if (ret != 0) { 246800b99b8Sopenharmony_ci printf("remove failed!"); 247800b99b8Sopenharmony_ci } 248800b99b8Sopenharmony_ci 249800b99b8Sopenharmony_ci return 0; 250800b99b8Sopenharmony_ci} 251800b99b8Sopenharmony_ci 252800b99b8Sopenharmony_ciNOINLINE int StackOver64(void) 253800b99b8Sopenharmony_ci{ 254800b99b8Sopenharmony_ci printf("test StackOver64"); 255800b99b8Sopenharmony_ci 256800b99b8Sopenharmony_ci return TestFunc1(); 257800b99b8Sopenharmony_ci} 258800b99b8Sopenharmony_ci 259800b99b8Sopenharmony_civoid *SleepThread(void *argv) 260800b99b8Sopenharmony_ci{ 261800b99b8Sopenharmony_ci int threadID = *(int*)argv; 262800b99b8Sopenharmony_ci printf("create MultiThread %d", threadID); 263800b99b8Sopenharmony_ci 264800b99b8Sopenharmony_ci int sleepTime = 10; 265800b99b8Sopenharmony_ci sleep(sleepTime); 266800b99b8Sopenharmony_ci 267800b99b8Sopenharmony_ci return 0; 268800b99b8Sopenharmony_ci} 269800b99b8Sopenharmony_ci 270800b99b8Sopenharmony_ciNOINLINE int StackTop(void) 271800b99b8Sopenharmony_ci{ 272800b99b8Sopenharmony_ci printf("test StackTop\n"); 273800b99b8Sopenharmony_ci register void* stackTop; 274800b99b8Sopenharmony_ci#if defined(__arm__) 275800b99b8Sopenharmony_ci __asm__ volatile ("mov %0, sp":"=r"(stackTop)::); 276800b99b8Sopenharmony_ci printf("crasher_c: stack top is = %08x\n", (unsigned int)stackTop); 277800b99b8Sopenharmony_ci#elif defined(__aarch64__) 278800b99b8Sopenharmony_ci __asm__ volatile ("mov %0, sp":"=r"(stackTop)::); 279800b99b8Sopenharmony_ci printf("crasher_c: stack top is = %16llx\n", (unsigned long long)stackTop); 280800b99b8Sopenharmony_ci#else 281800b99b8Sopenharmony_ci return 0; 282800b99b8Sopenharmony_ci#endif 283800b99b8Sopenharmony_ci 284800b99b8Sopenharmony_ci FILE *fp = NULL; 285800b99b8Sopenharmony_ci fp = fopen("/data/sp", "w"); 286800b99b8Sopenharmony_ci if (fp == NULL) { 287800b99b8Sopenharmony_ci printf("Open /data/sp failed, errno(%d)\n", errno); 288800b99b8Sopenharmony_ci return 0; 289800b99b8Sopenharmony_ci } 290800b99b8Sopenharmony_ci 291800b99b8Sopenharmony_ci int ret = 0; // for fixing compile error on x64 292800b99b8Sopenharmony_ci#if defined(__arm__) 293800b99b8Sopenharmony_ci ret = fprintf(fp, "%08x", (unsigned int)stackTop); 294800b99b8Sopenharmony_ci#elif defined(__aarch64__) 295800b99b8Sopenharmony_ci ret = fprintf(fp, "%16llx", (unsigned long long)stackTop); 296800b99b8Sopenharmony_ci#endif 297800b99b8Sopenharmony_ci if (ret == EOF) { 298800b99b8Sopenharmony_ci printf("error!"); 299800b99b8Sopenharmony_ci } 300800b99b8Sopenharmony_ci ret = fclose(fp); 301800b99b8Sopenharmony_ci if (ret == EOF) { 302800b99b8Sopenharmony_ci printf("close error!"); 303800b99b8Sopenharmony_ci } 304800b99b8Sopenharmony_ci 305800b99b8Sopenharmony_ci#if defined(__arm__) 306800b99b8Sopenharmony_ci __asm__ volatile ("mov r1, #0\nldr r2, [r1]\n"); 307800b99b8Sopenharmony_ci#elif defined(__aarch64__) 308800b99b8Sopenharmony_ci __asm__ volatile ("mov x1, #0\nldr x2, [x1]\n"); 309800b99b8Sopenharmony_ci#endif 310800b99b8Sopenharmony_ci return ret; 311800b99b8Sopenharmony_ci} 312800b99b8Sopenharmony_ci 313800b99b8Sopenharmony_civoid PrintUsage(void) 314800b99b8Sopenharmony_ci{ 315800b99b8Sopenharmony_ci printf(" usage: crasher CMD\n"); 316800b99b8Sopenharmony_ci printf("\n"); 317800b99b8Sopenharmony_ci printf(" where CMD support:\n"); 318800b99b8Sopenharmony_ci printf(" SIGFPE raise a SIGFPE\n"); 319800b99b8Sopenharmony_ci printf(" SIGILL raise a SIGILL\n"); 320800b99b8Sopenharmony_ci printf(" SIGSEGV raise a SIGSEGV\n"); 321800b99b8Sopenharmony_ci printf(" SIGTRAP raise a SIGTRAP\n"); 322800b99b8Sopenharmony_ci printf(" SIGABRT raise a SIGABRT\n"); 323800b99b8Sopenharmony_ci printf(" SIGBUS raise a SIGBUS\n"); 324800b99b8Sopenharmony_ci 325800b99b8Sopenharmony_ci printf(" triSIGILL trigger a SIGILL\n"); 326800b99b8Sopenharmony_ci printf(" triSIGSEGV trigger a SIGSEGV\n"); 327800b99b8Sopenharmony_ci printf(" triSIGTRAP trigger a SIGTRAP\n"); 328800b99b8Sopenharmony_ci printf(" triSIGABRT trigger a SIGABRT\n"); 329800b99b8Sopenharmony_ci 330800b99b8Sopenharmony_ci printf(" Loop trigger a ForeverLoop\n"); 331800b99b8Sopenharmony_ci printf(" MaxStack trigger SIGSEGV after 64 function call\n"); 332800b99b8Sopenharmony_ci printf(" MaxMethod trigger SIGSEGV after call a function with longer name\n"); 333800b99b8Sopenharmony_ci printf(" OOM trigger out of memory\n"); 334800b99b8Sopenharmony_ci printf(" STACKOF trigger a stack overflow\n"); 335800b99b8Sopenharmony_ci printf(" PCZero trigger pc = 0\n"); 336800b99b8Sopenharmony_ci printf(" MTCrash trigger crash with multi-thread\n"); 337800b99b8Sopenharmony_ci printf(" StackOver64 trigger SIGSEGV after 70 function call\n"); 338800b99b8Sopenharmony_ci printf(" StackTop trigger SIGSEGV to make sure stack top\n"); 339800b99b8Sopenharmony_ci printf(" if you want the command execute in a sub thread\n"); 340800b99b8Sopenharmony_ci printf(" add thread Prefix, e.g crasher thread-SIGFPE\n"); 341800b99b8Sopenharmony_ci printf("\n"); 342800b99b8Sopenharmony_ci} 343800b99b8Sopenharmony_ci 344800b99b8Sopenharmony_civoid *DoCrashInThread(void *inputArg) 345800b99b8Sopenharmony_ci{ 346800b99b8Sopenharmony_ci prctl(PR_SET_NAME, "SubTestThread"); 347800b99b8Sopenharmony_ci const char *arg = (const char *)(inputArg); 348800b99b8Sopenharmony_ci return (void *)((uint64_t)(ParseAndDoCrash(arg))); 349800b99b8Sopenharmony_ci} 350800b99b8Sopenharmony_ci 351800b99b8Sopenharmony_ciuint64_t DoActionOnSubThread(const char *arg) 352800b99b8Sopenharmony_ci{ 353800b99b8Sopenharmony_ci pthread_t t; 354800b99b8Sopenharmony_ci pthread_create(&t, NULL, DoCrashInThread, (char *)(arg)); 355800b99b8Sopenharmony_ci void *result = NULL; 356800b99b8Sopenharmony_ci pthread_join(t, &result); 357800b99b8Sopenharmony_ci return (uint64_t)(result); 358800b99b8Sopenharmony_ci} 359800b99b8Sopenharmony_ci 360800b99b8Sopenharmony_ciuint64_t ParseAndDoCrash(const char *arg) 361800b99b8Sopenharmony_ci{ 362800b99b8Sopenharmony_ci // Prefix 363800b99b8Sopenharmony_ci if (!strncmp(arg, "thread-", strlen("thread-"))) { 364800b99b8Sopenharmony_ci return DoActionOnSubThread(arg + strlen("thread-")); 365800b99b8Sopenharmony_ci } 366800b99b8Sopenharmony_ci 367800b99b8Sopenharmony_ci // Action 368800b99b8Sopenharmony_ci if (!strcasecmp(arg, "SIGFPE")) { 369800b99b8Sopenharmony_ci return RaiseFloatingPointException(); 370800b99b8Sopenharmony_ci } 371800b99b8Sopenharmony_ci 372800b99b8Sopenharmony_ci if (!strcasecmp(arg, "SIGILL")) { 373800b99b8Sopenharmony_ci return RaiseIllegalInstructionException(); 374800b99b8Sopenharmony_ci } 375800b99b8Sopenharmony_ci 376800b99b8Sopenharmony_ci if (!strcasecmp(arg, "triSIGILL")) { 377800b99b8Sopenharmony_ci return IllegalInstructionException(); 378800b99b8Sopenharmony_ci } 379800b99b8Sopenharmony_ci 380800b99b8Sopenharmony_ci if (!strcasecmp(arg, "SIGSEGV")) { 381800b99b8Sopenharmony_ci return RaiseSegmentFaultException(); 382800b99b8Sopenharmony_ci } 383800b99b8Sopenharmony_ci 384800b99b8Sopenharmony_ci if (!strcasecmp(arg, "SIGTRAP")) { 385800b99b8Sopenharmony_ci return RaiseTrapException(); 386800b99b8Sopenharmony_ci } 387800b99b8Sopenharmony_ci 388800b99b8Sopenharmony_ci if (!strcasecmp(arg, "SIGABRT")) { 389800b99b8Sopenharmony_ci return RaiseAbort(); 390800b99b8Sopenharmony_ci } 391800b99b8Sopenharmony_ci 392800b99b8Sopenharmony_ci if (!strcasecmp(arg, "triSIGABRT")) { 393800b99b8Sopenharmony_ci return Abort(); 394800b99b8Sopenharmony_ci } 395800b99b8Sopenharmony_ci 396800b99b8Sopenharmony_ci if (!strcasecmp(arg, "triSIGSEGV")) { 397800b99b8Sopenharmony_ci return SegmentFaultException(); 398800b99b8Sopenharmony_ci } 399800b99b8Sopenharmony_ci 400800b99b8Sopenharmony_ci if (!strcasecmp(arg, "SIGBUS")) { 401800b99b8Sopenharmony_ci return RaiseBusError(); 402800b99b8Sopenharmony_ci } 403800b99b8Sopenharmony_ci 404800b99b8Sopenharmony_ci if (!strcasecmp(arg, "triSIGTRAP")) { 405800b99b8Sopenharmony_ci return TriggerTrapException(); 406800b99b8Sopenharmony_ci } 407800b99b8Sopenharmony_ci 408800b99b8Sopenharmony_ci if (!strcasecmp(arg, "Loop")) { 409800b99b8Sopenharmony_ci int i = 0; 410800b99b8Sopenharmony_ci while (1) { 411800b99b8Sopenharmony_ci usleep(10000); // 10000:sleep 0.01 second 412800b99b8Sopenharmony_ci i++; 413800b99b8Sopenharmony_ci } 414800b99b8Sopenharmony_ci } 415800b99b8Sopenharmony_ci 416800b99b8Sopenharmony_ci if (!strcasecmp(arg, "MaxStack")) { 417800b99b8Sopenharmony_ci return MaxStackDepth(); 418800b99b8Sopenharmony_ci } 419800b99b8Sopenharmony_ci 420800b99b8Sopenharmony_ci if (!strcasecmp(arg, "MaxMethod")) { 421800b99b8Sopenharmony_ci return MaxMethodNameTest12345678901234567890123456789012345678901234567890ABC(); 422800b99b8Sopenharmony_ci } 423800b99b8Sopenharmony_ci 424800b99b8Sopenharmony_ci if (!strcasecmp(arg, "STACKOF")) { 425800b99b8Sopenharmony_ci return StackOverflow(); 426800b99b8Sopenharmony_ci } 427800b99b8Sopenharmony_ci 428800b99b8Sopenharmony_ci if (!strcasecmp(arg, "OOM")) { 429800b99b8Sopenharmony_ci return Oom(); 430800b99b8Sopenharmony_ci } 431800b99b8Sopenharmony_ci 432800b99b8Sopenharmony_ci if (!strcasecmp(arg, "PCZero")) { 433800b99b8Sopenharmony_ci return ProgramCounterZero(); 434800b99b8Sopenharmony_ci } 435800b99b8Sopenharmony_ci 436800b99b8Sopenharmony_ci if (!strcasecmp(arg, "MTCrash")) { 437800b99b8Sopenharmony_ci return MultiThreadCrash(); 438800b99b8Sopenharmony_ci } 439800b99b8Sopenharmony_ci 440800b99b8Sopenharmony_ci if (!strcasecmp(arg, "StackOver64")) { 441800b99b8Sopenharmony_ci return StackOver64(); 442800b99b8Sopenharmony_ci } 443800b99b8Sopenharmony_ci 444800b99b8Sopenharmony_ci if (!strcasecmp(arg, "StackTop")) { 445800b99b8Sopenharmony_ci return StackTop(); 446800b99b8Sopenharmony_ci } 447800b99b8Sopenharmony_ci 448800b99b8Sopenharmony_ci if (!strcasecmp(arg, "CrashTest")) { 449800b99b8Sopenharmony_ci return CrashTest(); 450800b99b8Sopenharmony_ci } 451800b99b8Sopenharmony_ci 452800b99b8Sopenharmony_ci return 0; 453800b99b8Sopenharmony_ci} 454800b99b8Sopenharmony_ci 455800b99b8Sopenharmony_ciNOINLINE int TestFunc70(void) 456800b99b8Sopenharmony_ci{ 457800b99b8Sopenharmony_ci int ret = raise(SIGSEGV); 458800b99b8Sopenharmony_ci if (ret != 0) { 459800b99b8Sopenharmony_ci printf("raise failed!"); 460800b99b8Sopenharmony_ci } 461800b99b8Sopenharmony_ci return 0; 462800b99b8Sopenharmony_ci} 463800b99b8Sopenharmony_ci 464800b99b8Sopenharmony_ciNOINLINE int CrashTest(void) 465800b99b8Sopenharmony_ci{ 466800b99b8Sopenharmony_ci int sleepTime = 3; 467800b99b8Sopenharmony_ci sleep(sleepTime); 468800b99b8Sopenharmony_ci int ret = raise(SIGSEGV); 469800b99b8Sopenharmony_ci if (ret != 0) { 470800b99b8Sopenharmony_ci printf("raise failed!"); 471800b99b8Sopenharmony_ci } 472800b99b8Sopenharmony_ci return 0; 473800b99b8Sopenharmony_ci} 474800b99b8Sopenharmony_ci 475800b99b8Sopenharmony_ciint main(int argc, char *argv[]) 476800b99b8Sopenharmony_ci{ 477800b99b8Sopenharmony_ci PrintUsage(); 478800b99b8Sopenharmony_ci if (argc <= 1) { 479800b99b8Sopenharmony_ci printf("wrong usage!"); 480800b99b8Sopenharmony_ci PrintUsage(); 481800b99b8Sopenharmony_ci return 0; 482800b99b8Sopenharmony_ci } 483800b99b8Sopenharmony_ci 484800b99b8Sopenharmony_ci printf("ParseAndDoCrash done: %" PRIu64 "!\n", ParseAndDoCrash(argv[1])); 485800b99b8Sopenharmony_ci return 0; 486800b99b8Sopenharmony_ci} 487800b99b8Sopenharmony_ci 488800b99b8Sopenharmony_ci// auto gen function 489800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(0, 1) 490800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(1, 2) 491800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(2, 3) 492800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(3, 4) 493800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(4, 5) 494800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(5, 6) 495800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(6, 7) 496800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(7, 8) 497800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(8, 9) 498800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(9, 10) 499800b99b8Sopenharmony_ci 500800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(10, 11) 501800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(11, 12) 502800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(12, 13) 503800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(13, 14) 504800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(14, 15) 505800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(15, 16) 506800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(16, 17) 507800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(17, 18) 508800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(18, 19) 509800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(19, 20) 510800b99b8Sopenharmony_ci 511800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(20, 21) 512800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(21, 22) 513800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(22, 23) 514800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(23, 24) 515800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(24, 25) 516800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(25, 26) 517800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(26, 27) 518800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(27, 28) 519800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(28, 29) 520800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(29, 30) 521800b99b8Sopenharmony_ci 522800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(30, 31) 523800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(31, 32) 524800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(32, 33) 525800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(33, 34) 526800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(34, 35) 527800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(35, 36) 528800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(36, 37) 529800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(37, 38) 530800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(38, 39) 531800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(39, 40) 532800b99b8Sopenharmony_ci 533800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(40, 41) 534800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(41, 42) 535800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(42, 43) 536800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(43, 44) 537800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(44, 45) 538800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(45, 46) 539800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(46, 47) 540800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(47, 48) 541800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(48, 49) 542800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(49, 50) 543800b99b8Sopenharmony_ci 544800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(50, 51) 545800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(51, 52) 546800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(52, 53) 547800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(53, 54) 548800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(54, 55) 549800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(55, 56) 550800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(56, 57) 551800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(57, 58) 552800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(58, 59) 553800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(59, 60) 554800b99b8Sopenharmony_ci 555800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(60, 61) 556800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(61, 62) 557800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(62, 63) 558800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(63, 64) 559800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(64, 65) 560800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(65, 66) 561800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(66, 67) 562800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(67, 68) 563800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(68, 69) 564800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(69, 70) 565