In SDK 9.20.0, NSException-originated crashes rethrown through objc_exception_rethrow can be silently dropped.
AutoLayout assertion failures caught internally by NSISEngine bypass the NSException monitor because the uncaught exception handler does not fire. CPPExceptionTerminate() runs but skips fatal-exception recording due to the isNSExceptionExc guard, which assumes the NSException monitor already handled the crash. Execution then reaches abort() with no report written.
Investigate the interaction between SentryCrashMonitor_NSException.m and the rethrow path, including the double-reporting prevention assumptions introduced in PR #7420. #7984 addressed non-NSException Objective-C throws but not this case.
The affected path is:
NSAssertionHandler throws NSException → Combine propagates it → NSISEngine catches and calls objc_exception_rethrow → _objc_terminate() → CPPExceptionTerminate() → abort() → SIGABRT.
In SDK 9.20.0, NSException-originated crashes rethrown through
objc_exception_rethrowcan be silently dropped.AutoLayout assertion failures caught internally by
NSISEnginebypass the NSException monitor because the uncaught exception handler does not fire.CPPExceptionTerminate()runs but skips fatal-exception recording due to theisNSExceptionExcguard, which assumes the NSException monitor already handled the crash. Execution then reachesabort()with no report written.Investigate the interaction between
SentryCrashMonitor_NSException.mand the rethrow path, including the double-reporting prevention assumptions introduced in PR #7420. #7984 addressed non-NSException Objective-C throws but not this case.The affected path is:
NSAssertionHandlerthrowsNSException→ Combine propagates it →NSISEnginecatches and callsobjc_exception_rethrow→_objc_terminate()→CPPExceptionTerminate()→abort()→SIGABRT.