KSCrashType kscrash_install(const char* const crashReportFilePath, const char* const recrashReportFilePath, const char* stateFilePath, const char* crashID) { KSLOG_DEBUG("Installing crash reporter."); KSCrash_Context* context = crashContext(); if(g_installed) { KSLOG_DEBUG("Crash reporter already installed."); return context->config.handlingCrashTypes; } g_installed = 1; ksmach_init(); ksobjc_init(); kscrash_reinstall(crashReportFilePath, recrashReportFilePath, stateFilePath, crashID); KSCrashType crashTypes = kscrash_setHandlingCrashTypes(context->config.handlingCrashTypes); context->config.systemInfoJSON = kssysteminfo_toJSON(); context->config.processName = kssysteminfo_copyProcessName(); KSLOG_DEBUG("Installation complete."); return crashTypes; }
bool kscrash_install(const char* const crashReportFilePath, const char* const recrashReportFilePath, const char* const stateFilePath, const char* const crashID, const char* const userInfoJSON, unsigned int zombieCacheSize, const bool printTraceToStdout, const KSReportWriteCallback onCrashNotify) { KSLOG_DEBUG("Installing crash reporter."); KSLOG_TRACE("reportFilePath = %s", reportFilePath); KSLOG_TRACE("secondaryReportFilePath = %s", secondaryReportFilePath); KSLOG_TRACE("stateFilePath = %s", stateFilePath); KSLOG_TRACE("crashID = %s", crashID); KSLOG_TRACE("userInfoJSON = %p", userInfoJSON); KSLOG_TRACE("zombieCacheSize = %d", zombieCacheSize); KSLOG_TRACE("printTraceToStdout = %d", printTraceToStdout); KSLOG_TRACE("onCrashNotify = %p", onCrashNotify); static volatile sig_atomic_t initialized = 0; if(!initialized) { initialized = 1; g_stateFilePath = strdup(stateFilePath); g_crashReportFilePath = strdup(crashReportFilePath); g_recrashReportFilePath = strdup(recrashReportFilePath); KSCrash_Context* context = crashContext(); context->crash.onCrash = kscrash_i_onCrash; if(ksmach_isBeingTraced()) { KSLOGBASIC_WARN("KSCrash: App is running in a debugger. Crash handlers have been disabled for the sanity of all."); } else if(kscrashsentry_installWithContext(&context->crash, KSCrashTypeAll) == 0) { KSLOG_ERROR("Failed to install any handlers"); } if(!kscrashstate_init(g_stateFilePath, &context->state)) { KSLOG_ERROR("Failed to initialize persistent crash state"); } context->state.appLaunchTime = mach_absolute_time(); context->config.printTraceToStdout = printTraceToStdout; context->config.systemInfoJSON = kssysteminfo_toJSON(); context->config.processName = kssystemInfo_copyProcessName(); kscrash_setUserInfoJSON(userInfoJSON); context->config.crashID = strdup(crashID); context->config.onCrashNotify = onCrashNotify; if(zombieCacheSize > 0) { KSLOG_DEBUG("zombieCacheSize > 0. Installing zombie handler."); kszombie_install(zombieCacheSize); } KSLOG_DEBUG("Installation complete."); return true; } KSLOG_ERROR("Called more than once"); return false; }