Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Debug React Native apps including metro bundler issues, native errors, performance problems, and crash analysis. Use when troubleshooting errors or investigating issues.
.claude/skills/aiskillstore-mobile-debugging/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 6% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 93% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 50% | 0% |
| case-05 | ✓→✗ | ▼ Worse | 272% | 0% |
| case-21 | ✓→✗ | ▼ Worse | 72% | 0% |
Debugging guide for React Native and Expo applications.
bash# Clear all caches npx expo start --clear watchman watch-del-all rm -rf node_modules && npm install # Reset packager cache rm -rf /tmp/metro-* rm -rf /tmp/haste-*
bash# iOS: Reset pods cd ios && pod deintegrate && pod install && cd .. # Android: Clean build cd android && ./gradlew clean && cd .. # Expo: Prebuild clean npx expo prebuild --clean
bash# iOS: Reset simulator xcrun simctl erase all # Android: Wipe emulator data adb devices # Find device ID adb -s DEVICE_ID emu kill
bash# Install npm install -g react-devtools # Start react-devtools # In app: Shake device -> "Debug Remote JS"
bash# View detailed logs npx expo start --verbose # iOS device logs npx react-native log-ios # Android device logs npx react-native log-android adb logcat
typescript// Enable network inspector import { Platform } from 'react-native'; if (__DEV__ && Platform.OS === 'ios') { require('react-native').NativeModules.DevSettings.setIsDebuggingRemotely(true); } // Or use Flipper for advanced network inspection
typescript// Add performance logging import { useEffect, useRef } from 'react'; function useRenderTime(componentName: string) { const start = useRef(performance.now()); useEffect(() => { const duration = performance.now() - start.current; if (duration > 16) { console.warn(`Slow render: ${componentName} took ${duration.toFixed(2)}ms`); } }); } // Use in components function MyComponent() { useRenderTime('MyComponent'); return <View>...</View>; }
typescript// Check for missing cleanup useEffect(() => { const subscription = someObservable.subscribe(); const timer = setInterval(() => {}, 1000); // MUST clean up! return () => { subscription.unsubscribe(); clearInterval(timer); }; }, []);
bash# Look for error in stack trace # Check recent file changes # Verify imports and dependencies # Check for typos in variable names
bash# iOS: Check Xcode console # Android: Check Android Studio Logcat # Look for Java/Swift exceptions # Check native module compatibility
bash# Check package versions npx expo-doctor # Verify node/npm versions node --version npm --version # Check for conflicting dependencies npm ls PACKAGE_NAME
bash# Check what's using a port lsof -ti:8081 # Metro bundler port lsof -ti:19000 # Expo DevTools # Kill process on port kill -9 $(lsof -ti:8081) # Check device connectivity # iOS xcrun simctl list devices # Android adb devices # Restart adb adb kill-server adb start-server
When investigating issues:
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 17,314 | 18,520 | +7% | 1 | 1 | 0% | 3,043 | 3,613 | +19% | 0 | 0 | — |
case-02 | fail→fail | 19,402 | 12,132 | -37% | 1 | 1 | 0% | 1,815 | 2,780 | +53% | 0 | 0 | — |
case-03 | fail→pass | 14,914 | 5,097 | -66% | 1 | 1 | 0% | 1,885 | 1,993 | +6% | 0 | 0 | — |
case-04 | pass→pass | 7,621 | 6,876 | -10% | 1 | 1 | 0% | 1,212 | 1,689 | +39% | 0 | 0 | — |
case-05 | pass→fail | 7,630 | 2,052 | -73% | 1 | 1 | 0% | 386 | 1,435 | +272% | 0 | 0 | — |
case-06 | pass→pass | 5,317 | 2,123 | -60% | 1 | 1 | 0% | 838 | 1,468 | +75% | 0 | 0 | — |
case-16 | pass→pass | 18,586 | 15,482 | -17% | 1 | 1 | 0% | 2,307 | 2,776 | +20% | 0 | 0 | — |
case-07 | pass→pass | 15,462 | 10,309 | -33% | 1 | 1 | 0% | 1,785 | 2,041 | +14% | 0 | 0 | — |
case-08 | pass→pass | 8,968 | 5,404 | -40% | 1 | 1 | 0% | 1,654 | 2,088 | +26% | 0 | 0 | — |
case-09 | pass→pass | 11,495 | 7,963 | -31% | 1 | 1 | 0% | 2,103 | 2,649 | +26% | 0 | 0 | — |
case-10 | pass→pass | 10,716 | 8,023 | -25% | 1 | 1 | 0% | 921 | 1,588 | +72% | 0 | 0 | — |
case-11 | fail→pass | 9,892 | 7,571 | -23% | 1 | 1 | 0% | 786 | 1,517 | +93% | 0 | 0 | — |
case-12 | fail→pass | 5,470 | 6,957 | +27% | 1 | 1 | 0% | 974 | 1,459 | +50% | 0 | 0 | — |
case-13 | pass→pass | 8,105 | 6,974 | -14% | 1 | 1 | 0% | 1,379 | 2,371 | +72% | 0 | 0 | — |
case-14 | pass→pass | 10,426 | 6,924 | -34% | 1 | 1 | 0% | 975 | 1,411 | +45% | 0 | 0 | — |
case-15 | pass→pass | 19,030 | 10,248 | -46% | 1 | 1 | 0% | 2,323 | 3,026 | +30% | 0 | 0 | — |
case-17 | pass→pass | 17,159 | 13,426 | -22% | 1 | 1 | 0% | 2,072 | 2,583 | +25% | 0 | 0 | — |
case-18 | pass→pass | 15,394 | 15,200 | -1% | 1 | 1 | 0% | 1,757 | 2,747 | +56% | 0 | 0 | — |
case-19 | pass→pass | 5,462 | 7,689 | +41% | 1 | 1 | 0% | 926 | 1,491 | +61% | 0 | 0 | — |
case-20 | pass→pass | 21,859 | 19,597 | -10% | 1 | 1 | 0% | 3,127 | 3,545 | +13% | 0 | 0 | — |
case-21 | pass→fail | 12,355 | 10,008 | -19% | 1 | 1 | 0% | 1,190 | 2,051 | +72% | 0 | 0 | — |
case-22 | pass→pass | 22,566 | 19,266 | -15% | 1 | 1 | 0% | 2,914 | 3,927 | +35% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +5 percentage points is the difference between those two pass rates over the 22 comparable cases. 3 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.