When using Xcode 26, we use devicectl and lldb to deploy to a physical iOS device. When the app crashes, we get logs like this:
[+4293 ms] [devicectl]: 2026-05-08 12:15:11.023818-0500 Runner[1173:276000] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** __boundsFail: index 2 beyond bounds [0 .. 1]'
[ +1 ms] [devicectl]: *** First throw call stack:
[ ] [devicectl]: (0x1a1cefc70 0x19e7c5224 0x1a1d8c38c 0x1a1c4fd94 0x1020ff604 0x1a78848f8 0x1a78a54fc 0x1a788a5e8 0x1a789e6c0 0x1a788b0c8 0x1a78a4214 0x1a788ddd0 0x1a78a7330 0x1a78a48bc 0x2b560156c 0x1a1bfce5c 0x1a1c3f384 0x1a1c3f2ac 0x1a1c0a368 0x1a1c091d0 0x246d01498 0x1a78cd2cc 0x1a7838158 0x100cbc0e4 0x19e81dc1c)
[ ] [devicectl]: *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** __boundsFail: index 2 beyond bounds [0 .. 1]'
[ ] [devicectl]: *** First throw call stack:
[ ] [devicectl]: (0x1a1cefc70 0x19e7c5224 0x1a1d8c38c 0x1a1c4fd94 0x1020ff604 0x1a78848f8 0x1a78a54fc 0x1a788a5e8 0x1a789e6c0 0x1a788b0c8 0x1a78a4214 0x1a788ddd0 0x1a78a7330 0x1a78a48bc 0x2b560156c 0x1a1bfce5c 0x1a1c3f384 0x1a1c3f2ac 0x1a1c0a368 0x1a1c091d0 0x246d01498 0x1a78cd2cc 0x1a7838158 0x100cbc0e4 0x19e81dc1c)
[ ] [devicectl]: libc++abi: terminating due to uncaught exception of type NSException
[ +16 ms] [lldb]: Process 1173 stopped
[ +1 ms] [lldb]: * thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGABRT
[ ] [lldb]: frame #0: 0x00000002502731d0 libsystem_kernel.dylib`__pthread_kill + 8
[ ] [lldb]: libsystem_kernel.dylib`__pthread_kill:
[ ] [lldb]: -> 0x2502731d0 <+8>: b.lo 0x2502731f0 ; <+40>
[ ] [lldb]: 0x2502731d4 <+12>: pacibsp
[ ] [lldb]: 0x2502731d8 <+16>: stp x29, x30, [sp, #-0x10]!
[ ] [lldb]: 0x2502731dc <+20>: mov x29, sp
[ ] [lldb]: Target 0: (Runner) stopped.
However, we can get even better stack traces if we send LLDB the following command: thread backtrace all or thread backtrace 1.
[+3645 ms] [lldb]: * thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGABRT
[ ] [lldb]: * frame #0: 0x00000002502731d0 libsystem_kernel.dylib`__pthread_kill + 8
[ ] [lldb]: frame #1: 0x00000002009717dc libsystem_pthread.dylib`pthread_kill + 268
[ ] [lldb]: frame #2: 0x00000001ad754de4 libsystem_c.dylib`abort + 148
[ ] [lldb]: frame #3: 0x000000019e8c5fd4 libc++abi.dylib`__abort_message + 132
[ ] [lldb]: frame #4: 0x000000019e8c7b90 libc++abi.dylib`demangling_terminate_handler() + 296
[ ] [lldb]: frame #5: 0x000000019e7c7868 libobjc.A.dylib`_objc_terminate() + 156
[ ] [lldb]: frame #6: 0x000000019e8d21f8 libc++abi.dylib`std::__terminate(void (*)()) + 16
[ ] [lldb]: frame #7: 0x000000019e8d3e18 libc++abi.dylib`__cxxabiv1::failed_throw(__cxxabiv1::__cxa_exception*) + 88
[ ] [lldb]: frame #8: 0x000000019e8c0360 libc++abi.dylib`__cxa_throw + 92
[ ] [lldb]: frame #9: 0x000000019e7c538c libobjc.A.dylib`objc_exception_throw + 448
[ ] [lldb]: frame #10: 0x00000001a1d8c38c CoreFoundation`__boundsFail + 480
[ ] [lldb]: frame #11: 0x00000001a1c4fd94 CoreFoundation`-[__NSArrayI objectAtIndex:] + 44
[ ] [lldb]: frame #12: 0x00000001020ff604 Flutter`-[FlutterViewController dispatchTouches:pointerDataChangeOverride:event:](self=0x00000001014de7a0, _cmd=<unavailable>, touches=1 element, overridden_change=0x0000000000000000, event=0x0000000101cc0800) at FlutterViewController.mm:1097:22 [opt]
[ ] [lldb]: frame #13: 0x00000001a78848f8 UIKitCore`forwardTouchMethod + 360
[ ] [lldb]: frame #14: 0x00000001a78a54fc UIKitCore`-[UIWindow _sendTouchesForEvent:] + 452
[ ] [lldb]: frame #15: 0x00000001a788a5e8 UIKitCore`-[UIWindow sendEvent:] + 3556
[ ] [lldb]: frame #16: 0x00000001a789e6c0 UIKitCore`-[UIApplication sendEvent:] + 408
[ ] [lldb]: frame #17: 0x00000001a788b0c8 UIKitCore`__dispatchPreprocessedEventFromEventQueue + 1024
[ ] [lldb]: frame #18: 0x00000001a78a4214 UIKitCore`__processEventQueue + 4932
[ ] [lldb]: frame #19: 0x00000001a788ddd0 UIKitCore`updateCycleEntry + 176
[ ] [lldb]: frame #20: 0x00000001a78a7330 UIKitCore`_UIUpdateSequenceRunNext + 128
[ ] [lldb]: frame #21: 0x00000001a78a48bc UIKitCore`schedulerStepScheduledMainSectionContinue + 60
[ ] [lldb]: frame #22: 0x00000002b560156c UpdateCycle`UC::DriverCore::continueProcessing() + 84
[ ] [lldb]: frame #23: 0x00000001a1bfce5c CoreFoundation`__CFMachPortPerform + 168
[ ] [lldb]: frame #24: 0x00000001a1c3f384 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 60
[ ] [lldb]: frame #25: 0x00000001a1c3f2ac CoreFoundation`__CFRunLoopDoSource1 + 504
[ ] [lldb]: frame #26: 0x00000001a1c0a368 CoreFoundation`__CFRunLoopRun + 2168
[ ] [lldb]: frame #27: 0x00000001a1c091d0 CoreFoundation`_CFRunLoopRunSpecificWithOptions + 532
[ ] [lldb]: frame #28: 0x0000000246d01498 GraphicsServices`GSEventRunModal + 120
[ ] [lldb]: frame #29: 0x00000001a78cd2cc UIKitCore`-[UIApplication _run] + 796
[ ] [lldb]: frame #30: 0x00000001a7838158 UIKitCore`UIApplicationMain + 332
[ ] [lldb]: frame #31: 0x0000000100cbc0e4 Runner`main(argc=<unavailable>, argv=<unavailable>) at main.m:10:16 [opt]
[ ] [lldb]: frame #32: 0x000000019e81dc1c dyld`start + 6928
When using Xcode 26, we use
devicectlandlldbto deploy to a physical iOS device. When the app crashes, we get logs like this:However, we can get even better stack traces if we send LLDB the following command:
thread backtrace allorthread backtrace 1.