[Desktop] iOS Simulator panel: claude-ios-sim crash-loops in Metal/CoreImage on macOS 27.0 beta — panel stuck on 'Attach a simulator'
Summary
The iOS Simulator panel in the Claude desktop app cannot start its video stream on macOS 27.0 beta. The helper process claude-ios-sim (com.anthropic.claude.ios-sim, bundled at Claude.app/Contents/Helpers/Claude iOS Sim.app) crash-loops with an uncaught NSException (SIGABRT) while initializing a CoreImage CIContext, so the panel stays stuck on the "Attach a simulator so Claude can see your app" placeholder, and the MCP screenshot action fails with "Claude Code iOS Simulator is restarting after a crash."
The attach MCP action reports success and the simulator itself is healthy (apps install, launch, and screenshot fine via xcrun simctl), so this is host-side in the panel's capture/streaming pipeline.
Environment
- Claude desktop app: 1.24012.1
- macOS: 27.0 beta (build 26A5388g), Apple Silicon
- Xcode 26.6, iOS Simulator runtimes 26.5 and 27.0
- Booted device: iPhone 17 Pro (iOS 26.5)
Crash signature
lastExceptionBacktrace from ~/Library/Logs/DiagnosticReports/claude-ios-sim-*.ips (identical across ~6 crashes over one day):
CoreFoundation __exceptionPreprocess
libobjc.A.dylib objc_exception_throw
CoreFoundation -[__NSPlaceholderArray initWithObjects:count:] <- nil object inserted
CoreFoundation +[NSArray arrayWithObjects:count:]
Metal __39-[_MTLDevice recordBinaryArchiveUsage:]_block_invoke
libdispatch _dispatch_once_callout
Metal -[_MTLDevice recordBinaryArchiveUsage:]
Metal -[_MTLBinaryArchive loadFromURL:error:]
Metal -[_MTLBinaryArchive initWithOptions:device:url:error:]
CoreImage +[CIKernelLibrary(Internal) internalBinaryArchiveWithName:device:]
CoreImage CI::PrecompiledUberFunctions::PrecompiledUberFunctions(CI::MetalContext const*)
CoreImage CI::MetalContext::init(id<MTLCommandQueue>, char const*)
CoreImage +[CIContext(Internal) internalContextWithMTLCommandQueue:options:]
CoreImage -[CIContext initWithMTLDevice:options:]
Termination: EXC_CRASH (SIGABRT), abort() called, thrown from __cxa_throw via _objc_terminate.
Looks like Metal's binary-archive usage recording gets a nil while building an NSArray on this OS build — i.e. an OS-beta incompatibility — but the helper turning that into a hard crash-loop (instead of falling back to a software/non-binary-archive CI context or surfacing an error in the panel) makes the whole feature unusable.
Steps to reproduce
- macOS 27.0 beta (26A5388g), Claude desktop 1.24012.1.
- Boot any iOS simulator (
xcrun simctl boot <udid>). - In a Claude Code session, use the iOS Simulator tool:
attachsucceeds and the panel opens. - Panel never streams (stays on the attach placeholder); any
screenshotaction returns "restarting after a crash", and a newclaude-ios-sim-*.ipscrash report appears each time.
What I ruled out
- Simulator/app health:
xcrun simctl io <udid> screenshotand app install/launch all work. - iOS runtime version: same behavior regardless of 26.5 vs 27.0 runtimes (crash is host-side, before any device pixels).
- Metal shader caches: deleting
$(getconf DARWIN_USER_CACHE_DIR)/com.apple.metalandcom.apple.metalfeand killing the helper did not change the signature.
Intermittently, after many helper restarts, one panel window did come up streaming — but new panel instances in the same session still land on the placeholder, so recovery is unreliable.
Expected
Either the panel streams on macOS 27 beta, or the helper catches the CI/Metal init failure and shows an actionable error in the panel instead of crash-looping behind a generic "Attach a simulator" placeholder.
Happy to share full .ips files on request.
20 Comments
Confirming this from a separate session — filed as #80257 before finding this one (closing mine as a dupe of this one).
Same symptoms:
attachreports success every time,screenshotalways returns "Claude Code iOS Simulator is restarting after a crash. Try again in 1s.", andxcrun simctl/xcodebuild build/xcodebuild testwere unaffected throughout — matches your "host-side in the panel's capture/streaming pipeline" conclusion exactly.One data point to add: a full macOS restart (not just the helper/Claude app) did not clear it. After rebooting the Mac entirely and relaunching Claude, the very first
attach/screenshotattempt reproduced the identical crash-loop immediately — no "many helper restarts" needed to reach the bad state, and no intermittent successful stream like you saw. This is consistent with your theory that it's a deterministic OS-beta/Metal incompatibility rather than corrupted cache/process state, since a full reboot clears all of that and it still failed on the first try.Also ruled out on my end before finding this issue: multiple simultaneously-booted simulators, and
Simulator.app(the GUI) not being running — neither was the cause; reproduces with exactly one cleanly booted device andSimulator.appconfirmed running viaps.Confirming on a third machine, with one data point that rules out a whole class of explanations.
Environment: Claude Desktop 1.24012.1, macOS 27.0 beta (26A5388g), Apple M5, Xcode 27.0 beta (27A5209h), iOS 27.0 runtime (24A5370g). Identical crash signature —
-[_MTLDevice recordBinaryArchiveUsage:]→+[NSArray arrayWithObjects:count:]nil insert, reached viaFBSurfaceImageGenerator.image()→-[CIContext initWithOptions:]. 9 crashes in a few minutes. Note this reproduces on M5 / Xcode 27 beta, where #80288 is M4 Pro / Xcode 27 release and this report is Xcode 26.6 — so it's independent of GPU generation and Xcode version.New: this is not a general macOS 27 Metal/CoreImage fault. I built a standalone Swift binary exercising the identical path (
CIContext(options: nil)→createCGImage). It succeeds every time on the same machine, under every condition I could match to the helper:| Condition | Result |
|---|---|
|
CIContext(options: nil)+createCGImage| works ||
CIContext(mtlCommandQueue:)| works || With
CoreSimulator.framework+SimulatorKit.frameworkdlopened first | works || With Metal shader cache (
…/C/com.apple.metal/<gpu>) moved aside | works || Under scrubbed env (
env -i, noTMPDIR/HOME) | works |The fault is specific to the
claude-ios-simprocess, not to CoreImage on this OS. Combined with the reboot test above, that also rules out corrupt shader cache and missing temp dir — the two things triage normally reaches for first.Possible direction: the helper is signed with an empty entitlements dictionary (
codesign -d --entitlements :-returns{}) and the abort is inside Metal's binary-archive path. I couldn't verify whether a missing GPU/Metal entitlement or a nil archive URL is the trigger without re-signing the app, but it may be worth checking.Control plane vs capture plane: with the #80288 symlink workaround applied,
attachsucceeds andtapis delivered correctly to a booted iPhone 17 Pro. Only frame capture crashes.Fourth machine confirming, plus a sandbox lead and one adjacent bug your environment can't hit.
Environment: Claude Desktop 1.24012.1, macOS 27.0 (26A5388g), M4 Pro, Xcode 27.0 beta
27A5228h, iOS 27.0 runtimes 24A5380i and 24A5390f. Identical backtrace throughFBSurfaceImageGenerator.image()→-[CIContext initWithOptions:]→_MTLBinaryArchive loadFromURL:→recordBinaryArchiveUsage:→ nil into+[NSArray arrayWithObjects:count:]. Filed separately as #80288 before finding this one.Combined with @oyeeamir's M5 / Xcode 27 beta
27A5209hand your Xcode 26.6, that's three GPU generations and three Xcode builds with one signature.Additionally ruled out here:
24A5380iand on24A5390f, including on a device created fresh, never booted before.xcode-selectstate — reproduced with it pointing at a stale path and after correcting it.screenshotheadlessly. Since no stream is running, this isn't in the encoder: the H.264/JPEG encoding toggle is a red herring (I burned time on it). Thedispatch_onceframe shows it's one-time Metal init on the connect path, before encoding is consulted.SIGABRTfrom an uncaught ObjC exception with a full in-process backtrace, not an externalSIGKILL.~/Library/Caches/com.apple.metal,com.apple.metalfe, and~/Library/Caches/com.anthropic.claude.ios-sim/com.apple.metalall made no difference.$DARWIN_USER_CACHE_DIR/com.apple.metalalready existed with populated per-GPU subdirs.Possible mechanism. The helper's sandbox profile (
Claude.app/Contents/Resources/claude-ios-sim.sb) is(deny default)and grantsfile-write*to onlyCORESIM_HOME,CORESIM_LOGS,DARWIN_TMPand/private/var/tmp. There's a param for the Darwin temp dir but **none for the Darwin user cache dir, and no rule for~/Library/Caches** — where Metal's shader cache lives. A commenter on #80288 reportsMTLGetShaderCachePathreturning nil when the helper's cache-dirmkdirfails, which fits: CoreImage'sinternalBinaryArchiveWithName:needs that path, gets nil, and nil goes into the array.That would also explain @oyeeamir's standalone-binary result — an unsandboxed process writes the cache fine, so the fault only appears under the helper's confinement. Stated as a hypothesis: I see no sandbox violation reports on disk or in the unified log for this process, so it isn't directly confirmed.
Separate bug, newer Xcode 27 seeds only (26.6 machines won't see it, and @oyeeamir's
27A5209happarently didn't either — so it seems to have landed between27A5209hand27A5228h): FBControlCore loads$DEVELOPER_DIR/Library/PrivateFrameworks/SimulatorKit.framework, but Xcode 27 removed that directory —SimulatorKit,DVTFoundation,DVTDeviceFoundationet al. now live inContents/SharedFrameworks.attachfails outright before any Metal code runs. Local workaround, which does work:Details in #80288. Anyone on a seed with the new layout hits that first and never reaches this crash.
---
Correction (edited): I originally wrote Xcode 27.0 release (not beta). Wrong — it's Xcode 27.0 beta
27A5228h; the bundle had been renamed fromXcode-beta.applocally so the path looked like a release install. The cross-environment point is unchanged, but the correct framing is three different builds, not a release-vs-beta split.Update for anyone landing here: both bugs now have verified one-line workarounds, and the Metal one has a full root-cause analysis in #80472.
Verified on macOS 27.0 beta (26A5388g), M4 Pro, Xcode 27 beta
27A5228h, iOS 27.024A5380i:attach,screenshotandtapall work afterwards. The panel had been 100% broken.Two corrections to what I wrote earlier in this thread, since they'd waste other people's time:
~/Library/Caches/…all failed. It is specifically$(getconf DARWIN_USER_CACHE_DIR)— theC/folder in/var/folders/.... The two are easy to conflate and only the latter works.I also bisected the fix in #80472: of the three directories originally published, only
com.apple.metalis required, and Metal never writes into it — it just has to exist.Confirming on a fifth machine, with one data point the thread doesn't have yet: still reproduces on Claude Desktop 1.24012.9 (thread so far only lists 1.24012.1).
Environment: Claude Desktop 1.24012.9, macOS 27.0 beta (
26A5388g), Apple Silicon (J516s), Xcode 26.6, iPhone 17 Pro (iOS 26.5).NSInvalidArgumentException"attempt to insert nil object from objects[0]" in__39-[_MTLDevice recordBinaryArchiveUsage:]_block_invoke, faulting threadcom.facebook.FBSimulatorControl.BitmapStream. Helper aborts ~1–2 s afterattachreports success; 11 identical.ipsfiles over an hour of crash-looping.PrivateFrameworkspath — only the Metal bug applies on this machine; no symlink workaround needed.sandboxdlogged no file-system denials for the helper — onlyuser-preference-readdenies (kCFPreferencesAnyApplication,com.apple.coresimulator) ~1 s before the abort. If the shader-cachemkdiris being denied, it isn't surfacing as a reported sandbox violation on this build.Info.plistships noCFBundleVersion/CFBundleShortVersionString(crash headers show emptyapp_version/build_version), in case Metal's usage-telemetry array also folds in bundle-version fields.Workaround verified here as well:
Immediately after creating the dir:
attach, live panel streaming, and headlessscreenshotall work, helper stays alive, no new.ips. No app restart needed — the next helper respawn picked it up. Happy to attach the.ipsfiles if useful (stack is byte-for-byte the OP's).Hitting the exact same crash-loop on macOS 27.0 beta (26A5388g) — caught it live with
log streamrunning alongside the panel, which adds a bit more detail.Setup: MacBook Air, Mac16,12 (Apple Silicon), macOS 27.0 beta 26A5388g, Xcode 26.3, iOS 26.3 simulator runtime, Claude desktop 1.26832.0.
claude-ios-simdoes launch (so it's not gated off before starting) and dies almost immediately. The live log around each crash shows a batch of sandbox denials right before it, repeated forclaude-ios-sim[<pid>]:Couldn't read values in CFPrefsPlistSource<...> (Domain: kCFPreferencesAnyApplication, ...): accessing these preferences requires user-preference-read or file-read-data sandbox access(not claiming this causes the crash — just noting it shows up right before, every time.)
Edit: an earlier version of this comment said no
.ipswas landing on disk. That was wrong — one did get written (claude-ios-sim-2026-08-10-154234.ips), I just hadn't looked in the right window. Its backtrace is identical to this issue's, down to the crashing dispatch queue:A couple of details from the actual report that weren't in the original post:
CoreImage.frameworkreportsCFBundleShortVersionString: 27.0.0(build 1663) — its own version string matches the OS beta number, so this looks like it could be a CoreImage/Metal regression specific to the beta build rather than anything in Claude's bundled code.Metal.frameworkis 382.5.Q6L2SF6YDW.com.facebook.FBSimulatorControl.BitmapStreamqueue that dies — i.e. specifically the screen-capture/streaming path, not simulator control in general.Each restart gets a new PID, confirming this cycles rather than sticking.
Also confirming what's already ruled out here:
xcrun simctl(install/launch/screenshot) and XCUITest (real synthesized taps) work perfectly against the same booted device throughout — only the live-streaming panel is affected.Have a ~13s screen recording (panel + a live filtered
log streamside by side) showing the click → black screen → "restarting after a crash" → repeat cycle, matched against the log in real time, plus the full.ips. Happy to attach either if useful.Confirming still present on a newer Desktop build and newer macOS seed, with a direct verification of the #80472 mechanism.
Environment: Claude Desktop 1.30096.5, macOS 27.0 beta 26A5406e, M4 Max (Mac16,13), Xcode 26.6 (17F113) selected; also Xcode 27 beta 4 installed but not selected. iOS 26.5 runtime, iPhone 17 booted.
Symptom: identical signature —
FBSurfaceImageGenerator.image()→-[CIContext initWithOptions:]→_MTLBinaryArchive loadFromURL:→recordBinaryArchiveUsage:→ nil into+[NSArray arrayWithObjects:count:], SIGABRT. Reproduced onscreenshotwith the panel detached (no video stream), so it is the one-time Metal init on the capture path, not the encoder.Verification of the seatbelt/cache theory: I drove the real helper binary over its stdio protocol (
describe/startVideo/screenshot/stopVideo) from a shell in four modes — bare, undersandbox-exec -f claude-ios-sim.sb, underHelpers/disclaimer, and disclaimer+sandbox exactly as the app spawns it. All four worked, including 200 KB PNG screenshots and bgra + h264 frames. The bare run created$(getconf DARWIN_USER_CACHE_DIR)/com.anthropic.claude.ios-sim/com.apple.metal/archiveUsage.db(timestamp matches to the second). From that moment the app-spawned sandboxed helper stopped crashing — zero further.ipsreports, panelattach+screenshotsucceed. Note the sandboxed runs in my test only passed because the bare run had already seeded the dir; before that, the app-spawned helper crashed on every attempt.So the fix is what #80472 says:
claude-ios-sim.sbneedsfile-write*on the helper's Metal cache subtree (DARWIN_USER_CACHE_DIR/com.anthropic.claude.ios-sim), or the helper should pre-create it before Metal init. Themkdir -pworkaround from that thread is the user-side equivalent.One adjacent observation for triage: with the crash cleared, the tool surface works, but the renderer is launched with
"iosSimulator":{"status":"unsupported","reason":"iOS Simulator is disabled by its rollout flag"}on this account/build, so the visible pane may still not render even after the helper is healthy — worth separating "helper crash" from "panel not shown" reports.Confirming @willsigmon's workaround on a different hardware/version combo — my earlier report in this thread, now resolved by the
mkdiralone.Environment: MacBook Air M4 (Mac16,12), macOS 27.0 beta 26A5388g, Claude Desktop 1.26832.0, Xcode 26.3, iOS 26.3 simulator runtime, iPhone 17 Pro booted.
$(getconf DARWIN_USER_CACHE_DIR)/com.anthropic.claude.ios-simdid not exist at all, and every attach/screenshot crash-looped as described above.mkdir -p "$(getconf DARWIN_USER_CACHE_DIR)/com.anthropic.claude.ios-sim/com.apple.metal"— no restarts, no other changes.attach,screenshot, andtapvia the MCP tool surface all work immediately and repeatedly. First successful panel capture on this machine since the issue started.So the seatbelt/cache mechanism reproduces across two quite different setups (M4 Max/26A5406e/Desktop 1.30096.5/Xcode 26.6 vs M4 Air/26A5388g/Desktop 1.26832.0/Xcode 26.3) — consistent with a structural sandbox-profile omission rather than anything version-specific.
Also matching the adjacent observation: on this account/build the renderer still reports
"iosSimulator": {"status": "unsupported", "reason": "iOS Simulator is disabled by its rollout flag"}, so the tool surface works while the visible pane may not — +1 for triaging "helper crash" and "panel not shown" as separate issues.Still reproduces on a fully-current stack — every component here is newer than anything else in this thread, so the sandbox-profile omission is still shipping.
Environment: Claude Desktop 1.32885.1, macOS 27.0 beta 26A5416b, M5 Pro (Mac17,9), Xcode 27.0 beta 27A5237l (only Xcode installed, and selected), iOS 27.0 runtime 24A5408d, iPhone 17 Pro booted.
For comparison the newest previously reported here was Desktop 1.30096.5 / macOS 26A5406e / Xcode 26.6 (@willsigmon, Aug 17) — so this adds a newer Desktop build, a newer macOS seed, a newer Xcode beta, a newer iOS runtime, and a GPU generation (M5 Pro) not yet represented.
Symptom: identical signature. The
exceptionReasonkey from the.ips(the crash viewer doesn't surface this, and I didn't see it quoted in full upthread):reached via
SimulatorBridge.screenshot(udid:)→FBSurfaceImageGenerator.image()→-[CIContext initWithOptions:]→CI::new_uber_functions→-[_MTLBinaryArchive loadFromURL:error:]→-[_MTLDevice recordBinaryArchiveUsage:]→dispatch_once→ SIGABRT.Before/after, single variable changed:
$(getconf DARWIN_USER_CACHE_DIR)/com.anthropic.claude.ios-simdid not exist at all. Everyattach/screenshotproduced a fresh.ips— one per call, confirmed by matching timestamps to the second.mkdir -p "$(getconf DARWIN_USER_CACHE_DIR)/com.anthropic.claude.ios-sim/com.apple.metal". No app restart, nothing else touched.attachandscreenshotboth succeed immediately and repeatedly, zero new crash reports.com.apple.metaldirectory is still empty afterwards. Metal never writes into it — it only has to exist.Reading the profile on this build lines up with #80472: in
Claude.app/Contents/Resources/claude-ios-sim.sbthe(allow file-write* …)block (~line 144) grantsDARWIN_TMPand/private/var/tmp, with no rule for the Darwin user cache dir — so the sandboxed helper can't create its own per-bundle Metal cache directory, and Metal aborts rather than degrading.One behavioural detail I didn't see stated explicitly upthread: the crash is confined to the image path. While the helper was still crash-looping, non-image actions worked perfectly —
button HOMEandtapboth returned success against the booted device and visibly took effect (verified out-of-band withxcrun simctl io <udid> screenshot, which also succeeded throughout at full resolution in ~0.5s). So pre-fix the tool surface is still usable for driving a simulator; only capture is dead. That also makes a decent workaround for anyone who can't run themkdir: drive with the MCP tool, capture withsimctl(mind the units — taps are in points,simctlPNGs are in pixels, 3× on this device).Related: the error string
"Claude Code iOS Simulator is restarting after a crash. Try again in 1s."implies transient recovery, but each retry re-crashes deterministically and it never recovers. Wording that suggests a persistent failure — or surfacing the underlying exception — would have saved a fair amount of digging.Also matching the earlier observation: this account/build still reports
"iosSimulator":{"status":"unsupported","reason":"iOS Simulator is disabled by its rollout flag"}in the renderer arguments, yetattachdoes open a panel and capture works post-fix.Adding a negative result on the
mkdirworkaround, on a newer macOS seed than anything above, plus four things ruled out with evidence.Environment: Claude Desktop 1.34493.1, macOS 27.0 beta 26A5416b, M2 Max, Xcode 26.6 (selected, and the only Xcode installed — so Bug 1 / SimulatorKit relocation is not in play here), iOS 26.5 runtime, iPhone 17 Pro booted.
Identical signature to this thread:
-[_MTLDevice recordBinaryArchiveUsage:]→+[NSArray arrayWithObjects:count:]nil insert, reached viaCI::MetalContext::init→new_uber_functions→_MTLBinaryArchive loadFromURL:, uncaught inside adispatch_once, SIGABRT. Faulting threadcom.facebook.FBSimulatorControl.BitmapStream. Three crashes in five seconds on retry.The
mkdirworkaround does not resolve it on 26A5416bAfter that: the directory stays empty — nothing is ever written into it — and the helper crashes with the identical backtrace. So on this build the missing directory looks like a symptom rather than the cause.
Four things ruled out here
CIContext(mtlCommandQueue:)and rendering an image through it succeeds on this machine. CoreImage-on-Metal is healthy outside the helper. This is worth stressing because the OS beta is in two of these issue titles — the beta alone is not sufficient to cause it.com.apple.metalandcom.apple.metalfeaside reproduced the identical signature on a cold cache; both regenerate normally.cpuType: ARM-64,translated: False.codesign -d --entitlementson the helper returns an empty entitlements dict (no App Sandbox), andlog showover the crash window shows no sandboxdenyfor this process. That does not disprove the shader-cache-directory theory, but it does mean the "sandbox can't create the dir" framing doesn't fit this helper build.One clarification that may help triage
The crash is not in the
screenshotaction. It is on the BitmapStream thread, ~2.3s afterattach.attachreturning success is a race against that thread starting, which is why it is sometimes reported as "attach works, screenshot fails". Consistent with that:tapandswipework reliably even while streaming is broken, since they never touch CoreImage. That makes a usable stopgap — drive input through the MCPtap/swipeactions and take images withxcrun simctl io <udid> screenshot.The
mkdirworkaround needs one more level than the version circulating in this thread, and it fixed the panel here once corrected. Posting because the short form is what people are copying, and on its own it does nothing.Environment: Claude Desktop 1.34493.1, macOS 27.0 beta 26A5416b, M2 Max, Xcode 26.6 (only Xcode installed and selected, so the SimulatorKit relocation is not in play), iOS 26.5 runtime.
What failed
Directory created, helper restarted — identical crash, and the directory stayed completely empty. Nothing was ever written into it.
What worked
Panel attaches, streams, and screenshots normally. Zero crashes since. Metal is now populating that directory.
Why the extra level matters
#80472's analysis has it right, and the answer is in the path it quotes:
$(getconf DARWIN_USER_CACHE_DIR)/<bundleID>/com.apple.metal/....copyCacheMainFolder("com.apple.metal", create: true)has to create thecom.apple.metalchild, not the bundle-ID folder. The seatbelt profile deniesmkdiron both, so pre-creating only the parent leaves the exactmkdirthat fails still failing —MTLGetShaderCachePath()returns nil and the unguarded+[NSArray arrayWithObjects:count:]throws as before.Sanity check that makes it obvious: every other GPU-using app on the machine already has both levels, e.g.
The helper was the only one missing them, because it is the only one that cannot create them itself.
Two notes for anyone landing here
DARWIN_USER_CACHE_DIRlives under/var/folders/...and is cleaned periodically, so this workaround is not necessarily permanent — if the panel starts crash-looping again, check whether the directory is still there before assuming a regression.BitmapStreamthread, ~2s afterattach, not in thescreenshotaction. Anattachthat returns success is a race against that thread starting. Related and useful while broken:tapandswipenever touch CoreImage and keep working, so input through the MCP actions plusxcrun simctl io <udid> screenshotis a complete stopgap.The real fix is still on the Anthropic side —
file-write*on the helper's Metal cache subtree inclaude-ios-sim.sb, as #80472 proposed.Independent confirmation + verified minimal fix, tying together what's spread across #80472 (closed as dup of this) and #88504.
Environment: macOS 27.0 beta 26A5388g, MacBook Air M3, Claude desktop (packaged), Xcode 26.3 (17C519).
Root cause (same crash as OP; verified by driving the shipped
claude-ios-simbinary directly over its stdio protocol against a booted device):Claude.app/Contents/Resources/claude-ios-sim.sballowsfile-write*only onCORESIM_HOME,CORESIM_LOGS,DARWIN_TMP, and/private/var/tmp.-[_MTLDevice recordBinaryArchiveUsage:]needs the per-user shader cache underDARWIN_USER_CACHE_DIR(the…/C/sibling of the allowed…/T/). With that write denied, a nil ends up in+[NSArray arrayWithObjects:count:]→ uncaughtNSInvalidArgumentException→ SIGABRT. (#80472 pins the nil toMTLGetShaderCachePath().)Causality A/B/C (same helper binary, same env, same booted iPhone 17 Pro sim,
describe→screenshot):sandbox-execline →describeOK,screenshotSIGABRT, 100%.screenshotreturns a valid PNG, 100%.After patching the shipped profile: panel attaches and streams, repeated screenshots/taps/HOME all work, helper stays resident, zero crashes since (was 27+ identical .ips since the beta landed).
Suggested fix: same as #88504 — pass a
DARWIN_CACHEparam from the sidecar spawn code (like the existingDARWIN_TMP) and allowfile-write*on it (or scope to itscom.apple.metal/ per-bundle subpaths per #80472). Also worth an ObjC exception guard around the FBSimulatorControl render call so future OS drift degrades to a per-call error instead of a crash-looped, circuit-breaker-parked panel.Notes:
MTLGetShaderCachePath()non-nil without needing the write grant.Same crash loop here. Extra data point that narrows it down a bit.
Environment: macOS 27.0 beta (26A5416b), Apple Silicon (arm64), Claude Desktop 1.37937.1,
claude-ios-simv309, Xcode 26.6, iOS 26.5 simruntime, iPhone 17 Pro simulator.Difference vs the OP: the panel is not stuck on "Attach a simulator" for us.
attachsucceeds andlaunchinstalls and launches the app fine. It is specifically the MCPcontrol {action:"screenshot"}call that kills the helper, 100% deterministically, after which the panel enters the restart loop ("Claude Code iOS Simulator is restarting after a crash. Try again in 1s."). Meanwhilexcrun simctl io booted screenshotworks fine against the same booted device, so the simulator itself is healthy; the crash is in the helper's screenshot path.Faulting thread (from the
.ips,com.apple.root.default-qos.cooperative):This lines up with the root-cause analysis in #88504:
-[_MTLBinaryArchive loadFromURL:error:]presumably fails (seatbelt-denied Metal cache dir on the macOS 27 beta), something comes back nil, andrecordBinaryArchiveUsage:then builds anNSArraycontaining that nil, which throwsNSInvalidArgumentExceptionand aborts the helper. A nil-check there (or letting the CIContext fall back to a non-precompiled path) would at least turn the crash loop into a failed screenshot.Follow-up: the
mkdir -pmitigation from #88504 (pre-creating$(getconf DARWIN_USER_CACHE_DIR)/com.anthropic.claude.ios-sim/com.apple.metal{,fe}) fixes it here too — helper v309, Claude Desktop 1.37937.1, macOS 26A5416b.screenshotwent from crashing 100% of calls to working instantly; empty dirs sufficed, no app restart needed.Still reproduces on the newest versions of both sides, and the minimal single-directory mitigation still fully resolves it.
Environment: Claude Desktop 1.40609.0, macOS 27.0 beta 26A5425a, Xcode 27.0 (27A5209h), iPhone 16 Pro simulator (iOS 18.3).
Before:
attachsucceeds, then the frame stream or anyscreenshotkills the sidecar within ~1s — three consecutive crashes, identical signature (CI::MetalContext::init→CIKernelLibrary internalBinaryArchiveWithName:device:→-[_MTLBinaryArchive loadFromURL:error:]→-[_MTLDevice recordBinaryArchiveUsage:]→ nil into+[NSArray arrayWithObjects:count:]→abort()). Reports:claude-ios-sim-2026-09-01-001035/-001040/-001049.ips.After
mkdir -p "$(getconf DARWIN_USER_CACHE_DIR)/com.anthropic.claude.ios-sim/com.apple.metal"— the single-dir form, nometalfeneeded here: next attach brings the h264 stream up,screenshotreturns live frames, zero sidecar exits and zero new.ipssince. No app restart required.One adjacent papercut worth fixing alongside: after 15 sidecar crashes in a session the supervisor parks the whole tool ("has stopped retrying after repeated crashes"), which also disables attach/tap/swipe — paths unaffected by this bug — and the message never points at the real crash. Same error-surfacing theme as #80180.
Still present on Claude Desktop 1.40609.1 (helper bundle dated 2026-08-30), macOS 27.0 beta 26A5425a, M3 Max, Xcode 26.6 + Xcode 27 beta installed (beta selected via xcode-select), iPhone 15 / iOS 17.5 simulator.
Same signature:
-[_MTLDevice recordBinaryArchiveUsage:]→+[NSArray arrayWithObjects:count:]nil insert, reached from FBSimulatorControl'scontextWithMTLDevice:options:. Crash logs in~/Library/Logs/DiagnosticReports/claude-ios-sim-*.ipsgoing back to the day this build was installed.Confirmed the #80472 mechanism on this build:
claude-ios-sim.sbin 1.40609.1 still only allowsfile-write*onCORESIM_HOME,CORESIM_LOGS,DARWIN_TMPand/private/var/tmp, so$(getconf DARWIN_USER_CACHE_DIR)/com.anthropic.claude.ios-sim/com.apple.metalcannot be created from inside the sandbox. Disassembly of the crashing block shows it building@[shaderCachePath, @"archiveUsage.db"]withshaderCachePathnil. A standaloneCIContext(mtlDevice:)test in an unsandboxed bundle with the same bundle id succeeds and creates the directory; once it exists,attachworks and the helper stays up.Workaround still holds:
Still reproduces on the newest Claude Desktop build in this thread, and the two-level
mkdirmitigation still fully resolves it.Environment
/Applications/Claude.app/Contents/Helpers/Claude iOS Sim.app/Contents/MacOS/claude-ios-simBefore: 11 identical
claude-ios-sim.ipsreports in ~7 minutes.attachreturns success, thenscreenshotreturns "Claude Code iOS Simulator is restarting after a crash. Try again in 1s." every time. Same signature as the OP, reached here viaSimulatorBridge.screenshot(udid:):$(getconf DARWIN_USER_CACHE_DIR)/com.anthropic.claude.ios-simdid not exist at all before the fix, consistent with the sandbox-deniedmkdiranalysis above.After:
attach→screenshotreturns a valid frame immediately, helper stays resident, zero new crash reports. The simulator itself (simctlboot/install/launch/io screenshot) was healthy throughout, as others have noted.One extra data point: this build's renderer is launched with
"iosSimulator":{"status":"unsupported","reason":"iOS Simulator is disabled by its rollout flag"}in its--desktop-features, yet the MCPcontroltool and the panel are still fully exposed. Not the cause of the crash, but it may explain why some users see the panel in a state Anthropic isn't expecting.Still present on Claude Desktop 1.46388.3 (newest build in this thread), macOS 27.0 beta 26A5425a, Apple Silicon, Xcode 27.0 beta 27A5237l selected (Xcode 26.6 17F113 also installed), iOS 27.0 runtime, iPhone 17 Pro booted through Simulator.app.
Same signature:
-[_MTLDevice recordBinaryArchiveUsage:]→+[NSArray arrayWithObjects:count:]nil insert on thecom.facebook.FBSimulatorControl.BitmapStreamqueue, exit 134, ten identical crash reports in a row. Headlessscreenshotworks; only the panel'sstartVideostream dies, so the panel flashes and drops back to "Attach a simulator" with "restarting after a crash. Try again in 1s."Two details for anyone triaging without a debugger:
(Metal) Failed to get cache main folder: mkdir failed to create cache path (errno = 1, path = <private>, attempting to create intermediate subdir '<private>', possible sandbox issue?). Filter with/usr/bin/log show --predicate 'process == "claude-ios-sim"'(barelogis a zsh builtin and returns nothing).sandboxdviolation stream for this process only showsuser-preference-read/writedenials (com.apple.CoreSimulator,kCFPreferencesAnyApplication); thefile-write-createdenial that matters never appears there, so an empty denial log is not evidence the sandbox is innocent.Verified by driving the shipped helper over its stdio protocol under the exact
sandbox-execinvocation the app uses (describe+startVideo, h264, 60 fps, scale 1):| profile |
$(getconf DARWIN_USER_CACHE_DIR)/com.anthropic.claude.ios-sim/com.apple.metal| result ||---|---|---|
| shipped | absent | SIGABRT, exit 134, same stack |
| shipped | pre-created, empty | 30/30 frames, exit 0 (3 runs) |
| shipped + rule below | absent | 30/30 frames, exit 0; Metal created
com.apple.metal/archiveUsage.db/{data,lock}.mdbandcom.apple.metalfe|Rule that fixes it in
claude-ios-sim.sb, scoped to the helper's own bundle-id subtree:One caution for anyone copying the profile patch instead of the
mkdir -pworkaround: on this install/Applications/Claude.appstill carriescom.apple.quarantine(set by today's auto-update) and the.sbis sealed in_CodeSignature/CodeResources, so editing it in place risks a "damaged app" refusal on the next launch. Pre-creating the directory is the safer interim fix until the profile ships with the rule, or the launcher creates the directory beforesandbox-exec.Confirming the
mkdirworkaround (two-level,com.apple.metalsubdir) fixes it here too.Environment: macOS Darwin 27.0.0 (build 27), Apple Silicon, Xcode Release Candidate, iPhone 18 Pro simulator (iOS 27.0).
Hit the identical symptom independently and filed a duplicate (#93245, now closed) before finding this thread:
attachreported success every time,screenshotalways returned "Claude Code iOS Simulator is restarting after a crash. Try again in 1s.",xcrun simctlunaffected throughout.Applied:
No app restart needed. Next
attach/screenshotworked immediately and repeatedly, live panel streaming confirmed with a real screenshot. Zero new crash reports since.One more data point for the "rollout flag is a red herring" thread: this account/build was also running with
"iosSimulator":{"status":"unsupported","reason":"iOS Simulator is disabled by its rollout flag"}in the renderer args, both before and after the fix — the flag is present on a now-working setup, so +1 to treating that as unrelated to the crash.🤖 Generated with Claude Code
Thanks, everyone, for the detailed reports.
The fix shipped in Claude Desktop 2.110.0. Auto-update will pick it up.
Once you're on the new build, please let us know here if you still see the crash on macOS 27.