void __pthread_abort_reason(const char *fmt, ...) { #if !TARGET_OS_EMBEDDED va_list ap; const char *str = fmt; _SIMPLE_STRING s = _simple_salloc(); va_start(ap, fmt); if (_simple_vsprintf(s, fmt, ap) == 0) { str = _simple_string(s); } CRSetCrashLogMessage(str); va_end(ap); #endif __pthread_abort(); }
// called by LIBC_ABORT void abort_report_np(const char* format, ...) { va_list list; const char *str; _SIMPLE_STRING s = _simple_salloc(); if ( s != NULL ) { va_start(list, format); _simple_vsprintf(s, format, list); va_end(list); str = _simple_string(s); } else { // _simple_salloc failed, but at least format may have useful info by itself str = format; } _ZN4dyld4haltEPKc(str); // _ZN4dyld4haltEPKc doesn't return, so we can't call _simple_sfree }