Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Investigate native React Native crashes (Fabric/Hermes/iOS) in ledger-live-mobile when JS error logs are missing or unhelpful. Use when the app dies silently, throws an NSException on iOS, or shows only a native stack trace.
.claude/skills/ledgerhq-debug-rn-native-crash/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | -19% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 12% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 9% | 0% |
| case-07 | ✗→✓ | ▲ Improved | -21% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 58% | 0% |
The mobile app crashes with one of:
NSInternalInconsistencyException, RCTFatal, Fabric assertion)RCTViewComponentView, RCTPerformMountInstructions, …) with no JS sourceIf the JS console already gives a clear stack, don't use this skill — read the JS error.
bashxcrun simctl list devices booted # get the booted sim UDID xcrun simctl spawn <UDID> log show --last 5m --style compact \ --predicate 'processImagePath CONTAINS "ledgerlivemobile" AND (eventMessage CONTAINS "Assertion failure" OR eventMessage CONTAINS "Attempt to unmount" OR eventMessage CONTAINS "Terminating app")'
Extract the exception message, native stack, and any view descriptors (frame, tag, backgroundColor, alpha). These already tell you a lot — see reference.md "Anatomy of a Fabric assertion message".
bashopen apps/ledger-live-mobile/ios/ledgerlivemobile.xcworkspace
objc_exception_throw.In the lldb console at the bottom of Xcode:
bt # full backtrace, find the frame in RN code frame select N # N = the RN frame (often RCTPerformMountInstructions)
po parentViewDescriptor.view po oldChildViewDescriptor.view p mutation.parentTag p mutation.index p oldChildShadowView.componentName
po [oldChildViewDescriptor.view superview] po [oldChildViewDescriptor.view accessibilityIdentifier] # = RN testID po [parentViewDescriptor.view superview] po [[parentViewDescriptor.view superview] accessibilityIdentifier] po [parentViewDescriptor.view subviews]
accessibilityIdentifier (= RN testID) you recognise in source. Grep for it:bash grep -rn 'testID="<identifier>"' apps/ledger-live-mobile/src libs/ui That's the RN component family. From there, read the JSX and find the conditional render / animation / library that produced the mismatch.
The vast majority of Fabric assertions come from a small set of patterns. See reference.md "Common Fabric crash patterns".
A common trap: Metro's file watcher dies on EMFILE: too many open files. Edits silently never reach the bundle. Always confirm Metro logged a fresh Compiled ios in Xs line after each edit (in the terminal running pnpm mobile start:ios, or wherever Metro's stdout is streaming).
If the watcher is broken, restart Metro with --reset-cache. Reload the app (Cmd+R in sim or shake → Reload).
accessibilityIdentifier / testID)withRepeat on unmount", "unstable keyExtractor")See reference.md in this folder for:
Other measured skills in the registry, with their headline benchmark lift.