~/fix/EXC_CRASH (SIGKILL · Code Signature Invalid) — fix
2026·04·20
fix20 April 2026#app-development

EXC_CRASH (SIGKILL · Code Signature Invalid) — fix

Why iOS terminates your app at launch with EXC_CRASH SIGKILL and a code-signature-invalid termination reason — and the order to investigate.

TL;DRiOS killed your process at launch because the kernel's `cs_validate_page` check failed against a page of code that doesn't hash to what the signature claims. This is almost always either an embedded binary mismatch, a JIT/hot-reload tool modifying memory, or a side-loaded build whose entitlements no longer match the running OS.
Exception Type: EXC_CRASH (SIGKILL) Exception Codes: 0x0000000000000000, 0x0000000000000000 Termination Reason: CODESIGNING 1 Invalid Page

Read the crash report carefully first

Look at `Termination Reason`. If it ends with `Invalid Page`, the kernel found a code page whose hash doesn't match. If it ends with `Library load`, a dynamic library failed signature validation at load time. If it ends with `Entitlements`, the running OS rejected an entitlement combination (common when sideloading a development build to an OS the dev profile doesn't permit).

Investigate in this order

  1. If you can reproduce on a simulator → it is NOT a signing issue (simulators don't enforce signatures). Look for a real crash instead.
  2. Check that every framework in `Frameworks/` is signed by the same Team ID (see the embedded-binary fix page).
  3. Disable any hot-reload, JIT, or in-process debug tooling and re-build from scratch.
  4. If sideloading via Sideloadly / AltStore / TrollStore, the entitlements signed into the binary may no longer be valid on the target OS — re-sideload with a current dev profile.
  5. Check Console.app on the Mac while reproducing on device — `installd` and `amfid` log the exact failed page index.

Fix path A — embedded binary mismatch

Run the diagnose command from the embedded-binary page and re-sign anything with a mismatched Team ID. Most invalid-page crashes at launch are a framework, not the host app.

Fix path B — JIT / hot-reload

Tools that swap code at runtime (some React Native dev menus, certain Lottie variants, the older Hyperloop bridge) need either entitlements that allow JIT or a signing identity that grants `dynamic-codesigning`. Distribution certs do not. Rebuild a development variant with `get-task-allow` and try again.

Fix path C — sideloaded build, OS upgraded

If you sideloaded the build before an iOS update and it's now crashing, that's expected: development entitlements (`dynamic-codesigning`, `com.apple.private.security.no-container`) are reset on OS upgrade. Re-sideload with a current personal team development profile.

Edge cases I've hit on real engagements

  • An on-device A/B-served WASM module was being marked executable — the kernel killed the host on the first call into it. Move the WASM blob to data and use an interpreter, or add JIT entitlements.
  • A static library shipped by a vendor was actually a dynamic dylib that failed signature inheritance at load time on iOS 17+.
  • A binary built with macOS 14 SDK installed on iOS 17 device — the page hash algorithm difference between SDK and OS triggered the crash.

Related fixes