155 lines
6.4 KiB
Diff
155 lines
6.4 KiB
Diff
diff --git a/src/google_breakpad/common/minidump_exception_mac.h b/src/google_breakpad/common/minidump_exception_mac.h
|
|
--- a/src/google_breakpad/common/minidump_exception_mac.h
|
|
+++ b/src/google_breakpad/common/minidump_exception_mac.h
|
|
@@ -62,16 +62,18 @@ typedef enum {
|
|
MD_EXCEPTION_MAC_BREAKPOINT = 6, /* code is CPU-specific */
|
|
/* EXC_BREAKPOINT */
|
|
MD_EXCEPTION_MAC_SYSCALL = 7,
|
|
/* EXC_SYSCALL */
|
|
MD_EXCEPTION_MAC_MACH_SYSCALL = 8,
|
|
/* EXC_MACH_SYSCALL */
|
|
MD_EXCEPTION_MAC_RPC_ALERT = 9,
|
|
/* EXC_RPC_ALERT */
|
|
+ MD_EXCEPTION_MAC_RESOURCE = 11,
|
|
+ /* EXC_RESOURCE */
|
|
MD_EXCEPTION_MAC_SIMULATED = 0x43507378
|
|
/* Fake exception code used by Crashpad's SimulateCrash ('CPsx'). */
|
|
} MDExceptionMac;
|
|
|
|
/* For (MDException).exception_flags. Breakpad minidump extension for Mac OS X
|
|
* support. Based on Darwin/Mac OS X' mach/ppc/exception.h and
|
|
* mach/i386/exception.h. This is what Mac OS X calls a "code". */
|
|
typedef enum {
|
|
@@ -201,9 +203,42 @@ typedef enum {
|
|
/* EXC_I386_PGFLT = 14: should not occur in user space */
|
|
/* EXC_I386_EXTERRFLT = 16: mapped to EXC_ARITHMETIC/EXC_I386_EXTERR */
|
|
MD_EXCEPTION_CODE_MAC_X86_ALIGNMENT_FAULT = 17
|
|
/* EXC_ALIGNFLT (for vector operations) */
|
|
/* EXC_I386_ENOEXTFLT = 32: should be handled by the kernel */
|
|
/* EXC_I386_ENDPERR = 33: should not occur */
|
|
} MDExceptionCodeMac;
|
|
|
|
+// The following definitions were taken from Darwin/XNU kernel sources.
|
|
+// See https://github.com/apple/darwin-xnu/blob/main/osfmk/kern/exc_resource.h
|
|
+
|
|
+typedef enum MDMacExcResourceType {
|
|
+ MD_MAC_EXC_RESOURCE_TYPE_CPU = 1,
|
|
+ MD_MAC_EXC_RESOURCE_TYPE_WAKEUPS = 2,
|
|
+ MD_MAC_EXC_RESOURCE_TYPE_MEMORY = 3,
|
|
+ MD_MAC_EXC_RESOURCE_TYPE_IO = 4,
|
|
+ MD_MAC_EXC_RESOURCE_TYPE_THREADS = 5
|
|
+} MDMacExcResourceType;
|
|
+
|
|
+typedef enum MDMacExcResourceFlavorCpu {
|
|
+ MD_MAC_EXC_RESOURCE_FLAVOR_CPU_MONITOR = 1,
|
|
+ MD_MAC_EXC_RESOURCE_FLAVOR_CPU_MONITOR_FATAL = 2
|
|
+} MDMacExcResourceFlavorCpu;
|
|
+
|
|
+typedef enum MDMacExcResourceFlavorWakeup {
|
|
+ MD_MAC_EXC_RESOURCE_FLAVOR_WAKEUPS_MONITOR = 1,
|
|
+} MDMacExcResourceFlavorWakeup;
|
|
+
|
|
+typedef enum MDMacExcResourceFlavorMemory {
|
|
+ MD_MAC_EXC_RESOURCE_FLAVOR_HIGH_WATERMARK = 1,
|
|
+} MDMacExcResourceFlavorMemory;
|
|
+
|
|
+typedef enum MDMacExcResourceIOFlavor {
|
|
+ MD_MAC_EXC_RESOURCE_FLAVOR_IO_PHYSICAL_WRITES = 1,
|
|
+ MD_MAC_EXC_RESOURCE_FLAVOR_IO_LOGICAL_WRITES = 2,
|
|
+} MDMacExcResourceIOFlavor;
|
|
+
|
|
+typedef enum MDMacExcResourceThreadsFlavor {
|
|
+ MD_MAC_EXC_RESOURCE_FLAVOR_THREADS_HIGH_WATERMARK = 1,
|
|
+} MDMacExcResourceThreadsFlavor;
|
|
+
|
|
#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_MAC_OSX_H__ */
|
|
diff --git a/src/processor/minidump_processor.cc b/src/processor/minidump_processor.cc
|
|
--- a/src/processor/minidump_processor.cc
|
|
+++ b/src/processor/minidump_processor.cc
|
|
@@ -1143,16 +1143,86 @@ string MinidumpProcessor::GetCrashReason
|
|
case MD_EXCEPTION_MAC_MACH_SYSCALL:
|
|
reason = "EXC_MACH_SYSCALL / ";
|
|
reason.append(flags_string);
|
|
break;
|
|
case MD_EXCEPTION_MAC_RPC_ALERT:
|
|
reason = "EXC_RPC_ALERT / ";
|
|
reason.append(flags_string);
|
|
break;
|
|
+ case MD_EXCEPTION_MAC_RESOURCE:
|
|
+ reason = "EXC_RESOURCE / ";
|
|
+ {
|
|
+ uint32_t type = (exception_flags >> 29) & 0x7ULL;
|
|
+ uint32_t flavor = (exception_flags >> 26) & 0x7ULL;
|
|
+ char flavor_string[6] = {};
|
|
+ switch (type) {
|
|
+ case MD_MAC_EXC_RESOURCE_TYPE_CPU:
|
|
+ reason.append("RESOURCE_TYPE_CPU / ");
|
|
+ switch (flavor) {
|
|
+ case MD_MAC_EXC_RESOURCE_FLAVOR_CPU_MONITOR:
|
|
+ reason.append("FLAVOR_CPU_MONITOR");
|
|
+ break;
|
|
+ case MD_MAC_EXC_RESOURCE_FLAVOR_CPU_MONITOR_FATAL:
|
|
+ reason.append("FLAVOR_CPU_MONITOR_FATAL");
|
|
+ break;
|
|
+ default:
|
|
+ snprintf(flavor_string, sizeof(flavor_string), "%#3x", flavor);
|
|
+ reason.append(flavor_string);
|
|
+ break;
|
|
+ }
|
|
+ break;
|
|
+ case MD_MAC_EXC_RESOURCE_TYPE_WAKEUPS:
|
|
+ reason.append("RESOURCE_TYPE_WAKEUPS / ");
|
|
+ if (flavor == MD_MAC_EXC_RESOURCE_FLAVOR_WAKEUPS_MONITOR) {
|
|
+ reason.append("FLAVOR_WAKEUPS_MONITOR");
|
|
+ } else {
|
|
+ snprintf(flavor_string, sizeof(flavor_string), "%#3x", flavor);
|
|
+ reason.append(flavor_string);
|
|
+ }
|
|
+ break;
|
|
+ case MD_MAC_EXC_RESOURCE_TYPE_MEMORY:
|
|
+ reason.append("RESOURCE_TYPE_MEMORY / ");
|
|
+ if (flavor == MD_MAC_EXC_RESOURCE_FLAVOR_HIGH_WATERMARK) {
|
|
+ reason.append("FLAVOR_HIGH_WATERMARK");
|
|
+ } else {
|
|
+ snprintf(flavor_string, sizeof(flavor_string), "%#3x", flavor);
|
|
+ reason.append(flavor_string);
|
|
+ }
|
|
+ break;
|
|
+ case MD_MAC_EXC_RESOURCE_TYPE_IO:
|
|
+ reason.append("EXC_RESOURCE_TYPE_IO / ");
|
|
+ switch (flavor) {
|
|
+ case MD_MAC_EXC_RESOURCE_FLAVOR_IO_PHYSICAL_WRITES:
|
|
+ reason.append("FLAVOR_IO_PHYSICAL_WRITES");
|
|
+ break;
|
|
+ case MD_MAC_EXC_RESOURCE_FLAVOR_IO_LOGICAL_WRITES:
|
|
+ reason.append("FLAVOR_IO_LOGICAL_WRITES");
|
|
+ break;
|
|
+ default:
|
|
+ snprintf(flavor_string, sizeof(flavor_string), "%#3x", flavor);
|
|
+ reason.append(flavor_string);
|
|
+ break;
|
|
+ }
|
|
+ break;
|
|
+ case MD_MAC_EXC_RESOURCE_TYPE_THREADS:
|
|
+ reason.append("EXC_RESOURCE_TYPE_THREADS / ");
|
|
+ if (flavor == MD_MAC_EXC_RESOURCE_FLAVOR_THREADS_HIGH_WATERMARK) {
|
|
+ reason.append("FLAVOR_THREADS_HIGH_WATERMARK");
|
|
+ } else {
|
|
+ snprintf(flavor_string, sizeof(flavor_string), "%#3x", flavor);
|
|
+ reason.append(flavor_string);
|
|
+ }
|
|
+ break;
|
|
+ default:
|
|
+ reason.append(flags_string);
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ break;
|
|
case MD_EXCEPTION_MAC_SIMULATED:
|
|
reason = "Simulated Exception";
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case MD_OS_WIN32_NT:
|