I have found crash in one of my apps when running image snapshot of UIViewController. In this specific case ViewController was ment to use as child and its view have translatesAutoresizingMasksIntoConstraints
property set to false. When trying to record snapshot on such ViewController snapshot was not able to produce png while somehow passing size guards (it looks like its size is 0,0).
Here is a stack trace from recording:
thread #1, queue = 'com.apple.main-thread', stop reason = Fatal error: Unexpectedly found nil while unwrapping an Optional value
frame #0: 0x000000010f5d5960 libswiftCore.dylib`_swift_runtime_on_report
frame #1: 0x000000010f627331 libswiftCore.dylib`_swift_stdlib_reportFatalError + 113
frame #2: 0x000000010f32d57a libswiftCore.dylib`function signature specialization <Arg[1] = [Closure Propagated : reabstraction thunk helper from @callee_guaranteed (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) -> () to @escaping @callee_guaranteed (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) -> (@out ()), Argument Types : [@callee_guaranteed (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) -> ()]> of generic specialization <()> of Swift.StaticString.withUTF8Buffer<A>((Swift.UnsafeBufferPointer<Swift.UInt8>) -> A) -> A + 58
frame #3: 0x000000010f5b573e libswiftCore.dylib`partial apply forwarder for closure #2 (Swift.UnsafeBufferPointer<Swift.UInt8>) -> () in Swift._fatalErrorMessage(_: Swift.StaticString, _: Swift.StaticString, file: Swift.StaticString, line: Swift.UInt, flags: Swift.UInt32) -> Swift.Never + 110
frame #4: 0x000000010f32d57a libswiftCore.dylib`function signature specialization <Arg[1] = [Closure Propagated : reabstraction thunk helper from @callee_guaranteed (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) -> () to @escaping @callee_guaranteed (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) -> (@out ()), Argument Types : [@callee_guaranteed (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) -> ()]> of generic specialization <()> of Swift.StaticString.withUTF8Buffer<A>((Swift.UnsafeBufferPointer<Swift.UInt8>) -> A) -> A + 58
frame #5: 0x000000010f4f76e9 libswiftCore.dylib`function signature specialization <Arg[2] = Dead, Arg[3] = Dead> of Swift._fatalErrorMessage(_: Swift.StaticString, _: Swift.StaticString, file: Swift.StaticString, line: Swift.UInt, flags: Swift.UInt32) -> Swift.Never + 105
frame #6: 0x000000010f32d053 libswiftCore.dylib`Swift._fatalErrorMessage(_: Swift.StaticString, _: Swift.StaticString, file: Swift.StaticString, line: Swift.UInt, flags: Swift.UInt32) -> Swift.Never + 19
* frame #7: 0x0000000129a1298a SnapshotTesting`closure #1 in static Snapshotting<>.image($0=0x0000600000fb4070) at UIImage.swift:25
frame #8: 0x0000000129a129cf SnapshotTesting`thunk for @escaping @callee_guaranteed (@guaranteed UIImage) -> (@owned Data) at <compiler-generated>:0
frame #9: 0x0000000129a12a31 SnapshotTesting`partial apply for thunk for @escaping @callee_guaranteed (@guaranteed UIImage) -> (@owned Data) at <compiler-generated>:0
frame #10: 0x00000001299b81cd SnapshotTesting`verifySnapshot<A, B>(value=0x0000000129999230 AppTests`reabstraction thunk helper from @callee_guaranteed () -> (@owned __C.UIViewController, @error @owned Swift.Error) to @escaping @callee_guaranteed () -> (@out __C.UIViewController, @error @owned Swift.Error)partial apply forwarder with unmangled suffix ".21" at <compiler-generated>, snapshotting=SnapshotTesting.Snapshotting<UIKit.UIViewController, UIKit.UIImage> @ 0x00007ffee24a66e8, name=nil, recording=false, timeout=5, file="AppTests/DashboardViewTests.swift", testName="testViewe()", line=30) at AssertSnapshot.swift:122
frame #11: 0x00000001299b4f08 SnapshotTesting`assertSnapshot<A, B>(value=0x0000000129999230 AppTests`reabstraction thunk helper from @callee_guaranteed () -> (@owned __C.UIViewController, @error @owned Swift.Error) to @escaping @callee_guaranteed () -> (@out __C.UIViewController, @error @owned Swift.Error)partial apply forwarder with unmangled suffix ".21" at <compiler-generated>, snapshotting=SnapshotTesting.Snapshotting<UIKit.UIViewController, UIKit.UIImage> @ 0x00007ffee24a66e8, name=nil, recording=false, timeout=5, file="AppTests/DashboardViewTests.swift", testName="testViewe()", line=30) at AssertSnapshot.swift:34
frame #12: 0x0000000129998a9c AppTests`DashboardViewTests.testViewe(self=0x00006000024f5aa0) at DashboardViewTests.swift:30
frame #13: 0x0000000129999304 AppTests`@objc DashboardViewTests.testViewe() at <compiler-generated>:0
frame #14: 0x000000010ee8c03c CoreFoundation`__invoking___ + 140
frame #15: 0x000000010ee894d5 CoreFoundation`-[NSInvocation invoke] + 325
frame #16: 0x0000000127e7b018 XCTest`__24-[XCTestCase invokeTest]_block_invoke.196 + 78
frame #17: 0x0000000127ed2c74 XCTest`-[XCTestCase(Failures) performFailableBlock:testCaseRun:shouldInterruptTest:] + 57
frame #18: 0x0000000127ed2b91 XCTest`-[XCTestCase(Failures) _performTurningExceptionsIntoFailuresInterruptAfterHandling:block:] + 96
frame #19: 0x0000000127e7acd9 XCTest`__24-[XCTestCase invokeTest]_block_invoke + 848
frame #20: 0x0000000127ed8b7e XCTest`-[XCUITestContext performInScope:] + 248
frame #21: 0x0000000127e7a8ce XCTest`-[XCTestCase testContextPerformInScope:] + 98
frame #22: 0x0000000127e7a97c XCTest`-[XCTestCase invokeTest] + 137
frame #23: 0x0000000127e7c4b7 XCTest`__26-[XCTestCase performTest:]_block_invoke_2 + 43
frame #24: 0x0000000127ed2c74 XCTest`-[XCTestCase(Failures) performFailableBlock:testCaseRun:shouldInterruptTest:] + 57
frame #25: 0x0000000127ed2b91 XCTest`-[XCTestCase(Failures) _performTurningExceptionsIntoFailuresInterruptAfterHandling:block:] + 96
frame #26: 0x0000000127e7c3ce XCTest`__26-[XCTestCase performTest:]_block_invoke.330 + 88
frame #27: 0x0000000127ee344b XCTest`+[XCTContext runInContextForTestCase:block:] + 225
frame #28: 0x0000000127e7bafd XCTest`-[XCTestCase performTest:] + 675
frame #29: 0x0000000127ebf1a2 XCTest`-[XCTest runTest] + 57
frame #30: 0x0000000127e76ccb XCTest`__27-[XCTestSuite performTest:]_block_invoke + 365
frame #31: 0x0000000127e764a3 XCTest`-[XCTestSuite _performProtectedSectionForTest:testSection:] + 55
frame #32: 0x0000000127e76766 XCTest`-[XCTestSuite performTest:] + 296
frame #33: 0x0000000127ebf1a2 XCTest`-[XCTest runTest] + 57
frame #34: 0x0000000127e76ccb XCTest`__27-[XCTestSuite performTest:]_block_invoke + 365
frame #35: 0x0000000127e764a3 XCTest`-[XCTestSuite _performProtectedSectionForTest:testSection:] + 55
frame #36: 0x0000000127e76766 XCTest`-[XCTestSuite performTest:] + 296
frame #37: 0x0000000127ebf1a2 XCTest`-[XCTest runTest] + 57
frame #38: 0x0000000127e76ccb XCTest`__27-[XCTestSuite performTest:]_block_invoke + 365
frame #39: 0x0000000127e764a3 XCTest`-[XCTestSuite _performProtectedSectionForTest:testSection:] + 55
frame #40: 0x0000000127e76766 XCTest`-[XCTestSuite performTest:] + 296
frame #41: 0x0000000127ebf1a2 XCTest`-[XCTest runTest] + 57
frame #42: 0x0000000127eeee86 XCTest`__44-[XCTTestRunSession runTestsAndReturnError:]_block_invoke + 171
frame #43: 0x0000000127eeefa7 XCTest`__44-[XCTTestRunSession runTestsAndReturnError:]_block_invoke.80 + 68
frame #44: 0x0000000127e8ebc1 XCTest`-[XCTestObservationCenter _observeTestExecutionForBlock:] + 585
frame #45: 0x0000000127eeebfa XCTest`-[XCTTestRunSession runTestsAndReturnError:] + 623
frame #46: 0x0000000127e5b6b6 XCTest`-[XCTestDriver runTestsAndReturnError:] + 422
frame #47: 0x0000000127edf9cd XCTest`_XCTestMain + 1478
frame #48: 0x000000010d851bb8 libXCTestBundleInject.dylib`__RunTests_block_invoke_2 + 13
frame #49: 0x000000010edea62c CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12
frame #50: 0x000000010ede9de0 CoreFoundation`__CFRunLoopDoBlocks + 336
frame #51: 0x000000010ede4654 CoreFoundation`__CFRunLoopRun + 1284
frame #52: 0x000000010ede3e11 CoreFoundation`CFRunLoopRunSpecific + 625
frame #53: 0x00000001146a71dd GraphicsServices`GSEventRunModal + 62
frame #54: 0x000000011a3cb81d UIKitCore`UIApplicationMain + 140
frame #55: 0x000000010d757b27 AppApp`main at AppDelegate.swift:14
frame #56: 0x0000000111285575 libdyld.dylib`start + 1
thread #1, queue = 'com.apple.main-thread', stop reason = Fatal error: Unexpectedly found nil while unwrapping an Optional value
frame #0: 0x000000010fffd960 libswiftCore.dylib`_swift_runtime_on_report
frame #1: 0x000000011004f331 libswiftCore.dylib`_swift_stdlib_reportFatalError + 113
frame #2: 0x000000010fd5557a libswiftCore.dylib`function signature specialization <Arg[1] = [Closure Propagated : reabstraction thunk helper from @callee_guaranteed (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) -> () to @escaping @callee_guaranteed (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) -> (@out ()), Argument Types : [@callee_guaranteed (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) -> ()]> of generic specialization <()> of Swift.StaticString.withUTF8Buffer<A>((Swift.UnsafeBufferPointer<Swift.UInt8>) -> A) -> A + 58
frame #3: 0x000000010ffdd73e libswiftCore.dylib`partial apply forwarder for closure #2 (Swift.UnsafeBufferPointer<Swift.UInt8>) -> () in Swift._fatalErrorMessage(_: Swift.StaticString, _: Swift.StaticString, file: Swift.StaticString, line: Swift.UInt, flags: Swift.UInt32) -> Swift.Never + 110
frame #4: 0x000000010fd5557a libswiftCore.dylib`function signature specialization <Arg[1] = [Closure Propagated : reabstraction thunk helper from @callee_guaranteed (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) -> () to @escaping @callee_guaranteed (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) -> (@out ()), Argument Types : [@callee_guaranteed (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) -> ()]> of generic specialization <()> of Swift.StaticString.withUTF8Buffer<A>((Swift.UnsafeBufferPointer<Swift.UInt8>) -> A) -> A + 58
frame #5: 0x000000010ff1f6e9 libswiftCore.dylib`function signature specialization <Arg[2] = Dead, Arg[3] = Dead> of Swift._fatalErrorMessage(_: Swift.StaticString, _: Swift.StaticString, file: Swift.StaticString, line: Swift.UInt, flags: Swift.UInt32) -> Swift.Never + 105
frame #6: 0x000000010fd55053 libswiftCore.dylib`Swift._fatalErrorMessage(_: Swift.StaticString, _: Swift.StaticString, file: Swift.StaticString, line: Swift.UInt, flags: Swift.UInt32) -> Swift.Never + 19
* frame #7: 0x000000012a43d77e SnapshotTesting`diff(old=0x0000600003dc4620, new=0x0000600003dc45b0) at UIImage.swift:99
frame #8: 0x000000012a43ac93 SnapshotTesting`closure #3 in static Snapshotting<>.image(old=0x0000600003dc4620, new=0x0000600003dc45b0, precision=1) at UIImage.swift:29
frame #9: 0x000000012a43b15f SnapshotTesting`partial apply for closure #3 in static Snapshotting<>.image(precision:) at <compiler-generated>:0
frame #10: 0x000000012a43ddb2 SnapshotTesting`thunk for @escaping @callee_guaranteed (@guaranteed UIImage, @guaranteed UIImage) -> (@owned (String, [Attachment])?) at <compiler-generated>:0
frame #11: 0x000000012a43de11 SnapshotTesting`partial apply for thunk for @escaping @callee_guaranteed (@guaranteed UIImage, @guaranteed UIImage) -> (@owned (String, [Attachment])?) at <compiler-generated>:0
frame #12: 0x000000012a3de994 SnapshotTesting`verifySnapshot<A, B>(value=0x000000012a3c0d60 AppTests`partial apply forwarder for reabstraction thunk helper from @callee_guaranteed () -> (@owned __C.UIViewController, @error @owned Swift.Error) to @escaping @callee_guaranteed () -> (@out __C.UIViewController, @error @owned Swift.Error) at <compiler-generated>, snapshotting=SnapshotTesting.Snapshotting<UIKit.UIViewController, UIKit.UIImage> @ 0x00007ffee1a7e648, name=nil, recording=false, timeout=5, file="AppTests/DashboardViewTests.swift", testName="testView()", line=25) at AssertSnapshot.swift:129
frame #13: 0x000000012a3dcf08 SnapshotTesting`assertSnapshot<A, B>(value=0x000000012a3c0d60 AppTests`partial apply forwarder for reabstraction thunk helper from @callee_guaranteed () -> (@owned __C.UIViewController, @error @owned Swift.Error) to @escaping @callee_guaranteed () -> (@out __C.UIViewController, @error @owned Swift.Error) at <compiler-generated>, snapshotting=SnapshotTesting.Snapshotting<UIKit.UIViewController, UIKit.UIImage> @ 0x00007ffee1a7e648, name=nil, recording=false, timeout=5, file="AppTests/DashboardViewTests.swift", testName="testView()", line=25) at AssertSnapshot.swift:34
frame #14: 0x000000012a3c0455 AppTests`DashboardViewTests.testView(self=0x0000600001680400) at DashboardViewTests.swift:25
frame #15: 0x000000012a3c1314 AppTests`@objc DashboardViewTests.testView() at <compiler-generated>:0
frame #16: 0x000000010f8b403c CoreFoundation`__invoking___ + 140
frame #17: 0x000000010f8b14d5 CoreFoundation`-[NSInvocation invoke] + 325
frame #18: 0x00000001288a2018 XCTest`__24-[XCTestCase invokeTest]_block_invoke.196 + 78
frame #19: 0x00000001288f9c74 XCTest`-[XCTestCase(Failures) performFailableBlock:testCaseRun:shouldInterruptTest:] + 57
frame #20: 0x00000001288f9b91 XCTest`-[XCTestCase(Failures) _performTurningExceptionsIntoFailuresInterruptAfterHandling:block:] + 96
frame #21: 0x00000001288a1cd9 XCTest`__24-[XCTestCase invokeTest]_block_invoke + 848
frame #22: 0x00000001288ffb7e XCTest`-[XCUITestContext performInScope:] + 248
frame #23: 0x00000001288a18ce XCTest`-[XCTestCase testContextPerformInScope:] + 98
frame #24: 0x00000001288a197c XCTest`-[XCTestCase invokeTest] + 137
frame #25: 0x00000001288a34b7 XCTest`__26-[XCTestCase performTest:]_block_invoke_2 + 43
frame #26: 0x00000001288f9c74 XCTest`-[XCTestCase(Failures) performFailableBlock:testCaseRun:shouldInterruptTest:] + 57
frame #27: 0x00000001288f9b91 XCTest`-[XCTestCase(Failures) _performTurningExceptionsIntoFailuresInterruptAfterHandling:block:] + 96
frame #28: 0x00000001288a33ce XCTest`__26-[XCTestCase performTest:]_block_invoke.330 + 88
frame #29: 0x000000012890a44b XCTest`+[XCTContext runInContextForTestCase:block:] + 225
frame #30: 0x00000001288a2afd XCTest`-[XCTestCase performTest:] + 675
frame #31: 0x00000001288e61a2 XCTest`-[XCTest runTest] + 57
frame #32: 0x000000012889dccb XCTest`__27-[XCTestSuite performTest:]_block_invoke + 365
frame #33: 0x000000012889d4a3 XCTest`-[XCTestSuite _performProtectedSectionForTest:testSection:] + 55
frame #34: 0x000000012889d766 XCTest`-[XCTestSuite performTest:] + 296
frame #35: 0x00000001288e61a2 XCTest`-[XCTest runTest] + 57
frame #36: 0x000000012889dccb XCTest`__27-[XCTestSuite performTest:]_block_invoke + 365
frame #37: 0x000000012889d4a3 XCTest`-[XCTestSuite _performProtectedSectionForTest:testSection:] + 55
frame #38: 0x000000012889d766 XCTest`-[XCTestSuite performTest:] + 296
frame #39: 0x00000001288e61a2 XCTest`-[XCTest runTest] + 57
frame #40: 0x000000012889dccb XCTest`__27-[XCTestSuite performTest:]_block_invoke + 365
frame #41: 0x000000012889d4a3 XCTest`-[XCTestSuite _performProtectedSectionForTest:testSection:] + 55
frame #42: 0x000000012889d766 XCTest`-[XCTestSuite performTest:] + 296
frame #43: 0x00000001288e61a2 XCTest`-[XCTest runTest] + 57
frame #44: 0x0000000128915e86 XCTest`__44-[XCTTestRunSession runTestsAndReturnError:]_block_invoke + 171
frame #45: 0x0000000128915fa7 XCTest`__44-[XCTTestRunSession runTestsAndReturnError:]_block_invoke.80 + 68
frame #46: 0x00000001288b5bc1 XCTest`-[XCTestObservationCenter _observeTestExecutionForBlock:] + 585
frame #47: 0x0000000128915bfa XCTest`-[XCTTestRunSession runTestsAndReturnError:] + 623
frame #48: 0x00000001288826b6 XCTest`-[XCTestDriver runTestsAndReturnError:] + 422
frame #49: 0x00000001289069cd XCTest`_XCTestMain + 1478
frame #50: 0x000000010e279bb8 libXCTestBundleInject.dylib`__RunTests_block_invoke_2 + 13
frame #51: 0x000000010f81262c CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12
frame #52: 0x000000010f811de0 CoreFoundation`__CFRunLoopDoBlocks + 336
frame #53: 0x000000010f80c654 CoreFoundation`__CFRunLoopRun + 1284
frame #54: 0x000000010f80be11 CoreFoundation`CFRunLoopRunSpecific + 625
frame #55: 0x00000001138221dd GraphicsServices`GSEventRunModal + 62
frame #56: 0x0000000118cba81d UIKitCore`UIApplicationMain + 140
frame #57: 0x000000010e17fb27 AppApp`main at AppDelegate.swift:14
frame #58: 0x0000000111cad575 libdyld.dylib`start + 1