[iOS] Reload crashes the app while a view command is still queued

Aperta
#59,721 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 2 giorni

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
45/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Attiva
Stack tecnologico
cpp, ios, react-native
Ambito
mobile

Direzione di ricerca

The crash stack points to RuntimeScheduler_Modern.cpp (updateRendering, runEventLoopTick) and Scheduler::uiManagerDidDispatchCommand. Start by building the provided reproducer on an iOS simulator, then read the scheduler code around line 400 to see how queued view commands interact with reload. Done means ./loop.sh reports 0 crashes in 20 reloads.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Needs: Triage :mag: Platform: iOS Type: New Architecture
Description

On iOS, reloading the app while a view command is still queued crashes it on the JS thread with EXC_BAD_ACCESS.

scrollRef.current?.scrollTo({ y: 0, animated: false });
DevSettings.reload();
busyWait(100); // keeps the JS thread in this task for 100 ms

Likely the same crash was reported in #58601 and #53774 but without a repro.

Steps to reproduce
  1. Clone the reproducer and install it:
    npm install
    cd ios && bundle install && bundle exec pod install && cd ..
    
  2. Start Metro with npx react-native start, then build and run on an iOS simulator with npx react-native run-ios.
  3. The app reloads itself about 1 s after every mount, and usually crashes on the first reload.

My setup: Debug build, prebuilt React.xcframework, iPhone 17 simulator, iOS 26.5

To count the crashes, quit the app and run ./loop.sh default 20. It relaunches the app for each trial and prints default: N crashes in 20 reloads.

React Native Version

0.88.1

Affected Platforms

Runtime - iOS

Areas

Fabric - The New Renderer

Output of npx @react-native-community/cli info
System:
  OS: macOS 26.7.1
  CPU: (14) arm64 Apple M4 Pro
  Memory: 11.90 GB / 48.00 GB
  Shell:
    version: "5.9"
    path: /bin/zsh
Binaries:
  Node:
    version: 24.22.1
    path: /opt/homebrew/bin/node
  Yarn: Not Found
  npm:
    version: 11.19.1
    path: /opt/homebrew/bin/npm
  Watchman: Not Found
Managers:
  CocoaPods:
    version: 1.17.0
    path: /opt/homebrew/bin/pod
SDKs:
  iOS SDK:
    Platforms:
      - DriverKit 27.0
      - iOS 27.1
      - macOS 27.0
      - tvOS 27.0
      - visionOS 27.0
      - watchOS 27.0
  Android SDK: Not Found
IDEs:
  Android Studio: Not Found
  Xcode:
    version: 27.1/27A9275
    path: /usr/bin/xcodebuild
Languages:
  Java:
    version: 17.0.20.1
    path: /usr/bin/javac
  Ruby:
    version: 4.0.9
    path: /opt/homebrew/bin/ruby
npmPackages:
  "@react-native-community/cli":
    installed: 20.2.0
    wanted: 20.2.0
  react:
    installed: 19.3.0
    wanted: 19.3.0
  react-native:
    installed: 0.88.1
    wanted: 0.88.1
  react-native-macos: Not Found
npmGlobalPackages:
  "*react-native*": Not Found
Android:
  hermesEnabled: true
  newArchEnabled: true
iOS:
  hermesEnabled: true
  newArchEnabled: true
Stacktrace or Logs
Exception: EXC_BAD_ACCESS (SIGBUS) KERN_PROTECTION_FAILURE at 0x00000001090a659c
Crashed thread: com.facebook.react.runtime.JavaScript
0   ???                          0x1090a659c
1   ReproducerApp.debug.dylib    std::__invoke<facebook::react::Scheduler::uiManagerDidDispatchCommand(...)::$_0&>(...) (invoke.h:90)
2   ReproducerApp.debug.dylib    std::__invoke_void_return_wrapper<void, true>::__call<...uiManagerDidDispatchCommand(...)::$_0&>(...) (invoke.h:350)
3   ReproducerApp.debug.dylib    std::__invoke_r<void, ...uiManagerDidDispatchCommand(...)::$_0&>(...) (invoke.h:356)
4   ReproducerApp.debug.dylib    std::__function::__func<facebook::react::Scheduler::uiManagerDidDispatchCommand(...)::$_0, void ()>::operator()() (function.h:172)
5   ReproducerApp.debug.dylib    std::__function::__value_func<void ()>::operator()() const (function.h:273)
6   ReproducerApp.debug.dylib    std::function<void ()>::operator()() const (function.h:754)
7   ReproducerApp.debug.dylib    facebook::react::RuntimeScheduler_Modern::updateRendering(facebook::jsi::Runtime&, facebook::react::HighResTimeStamp) (RuntimeScheduler_Modern.cpp:400)
8   ReproducerApp.debug.dylib    facebook::react::RuntimeScheduler_Modern::runEventLoopTick(facebook::jsi::Runtime&, facebook::react::Task&) (RuntimeScheduler_Modern.cpp:343)
9   ReproducerApp.debug.dylib    facebook::react::RuntimeScheduler_Modern::runEventLoop(facebook::jsi::Runtime&) (RuntimeScheduler_Modern.cpp:287)
10  ReproducerApp.debug.dylib    facebook::react::RuntimeScheduler_Modern::scheduleEventLoop()::$_0::operator()(facebook::jsi::Runtime&) const (RuntimeScheduler_Modern.cpp:272)
MANDATORY Reproducer

https://github.com/Nezz/expo-repro/tree/repro/ReloadSchedulerCrash

Screenshots and Videos
Lingua principale
C++
Stelle
127k
Fork
25.4k
Merge medio
2g 5h
PR unite (30g)
74

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di react/react-native

Tutte le issue di react/react-native

Issue simili

Altre issue su C++

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.