1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| extern void _objc_fatal(const char *fmt, ...) __attribute__((noreturn, cold, format (printf, 1, 2))); extern void _objc_fatal_with_reason(uint64_t reason, uint64_t flags, const char *fmt, ...) __attribute__((noreturn, cold, format (printf, 3, 4)));
void _objc_fatal(const char *fmt, ...) { va_list ap; va_start(ap,fmt); _objc_fatalv(OBJC_EXIT_REASON_UNSPECIFIED, OS_REASON_FLAG_ONE_TIME_FAILURE, fmt, ap); } void _objc_fatalv(uint64_t reason, uint64_t flags, const char *fmt, va_list ap) { char *buf1; _objc_vasprintf(&buf1, fmt, ap);
char *buf2; _objc_asprintf(&buf2, "objc[%d]: %s\n", getpid(), buf1); _objc_syslog(buf2);
if (DebugDontCrash) { char *buf3; _objc_asprintf(&buf3, "objc[%d]: HALTED\n", getpid()); _objc_syslog(buf3); _Exit(1); } else { _objc_crashlog(buf1); abort_with_reason(OS_REASON_OBJC, reason, buf1, flags); } }
void abort_with_reason(uint32_t reason_namespace, uint64_t reason_code, const char *reason_string, uint64_t reason_flags) { abort_with_payload_wrapper_internal(reason_namespace, reason_code, 0, 0, reason_string, reason_flags); } static void abort_with_payload_wrapper_internal(uint32_t reason_namespace, uint64_t reason_code, void *payload, uint32_t payload_size, const char *reason_string, uint64_t reason_flags) { sigset_t unmask_signal;
sigemptyset(&unmask_signal); sigaddset(&unmask_signal, SIGABRT); sigprocmask(SIG_UNBLOCK, &unmask_signal, NULL);
__abort_with_payload(reason_namespace, reason_code, payload, payload_size, reason_string, reason_flags);
terminate_with_payload(getpid(), reason_namespace, reason_code, payload, payload_size, reason_string, reason_flags);
sigemptyset(&unmask_signal); sigaddset(&unmask_signal, SIGTRAP); sigaddset(&unmask_signal, SIGILL); sigprocmask(SIG_UNBLOCK, &unmask_signal, NULL);
__builtin_trap(); }
|