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.
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
- If you can reproduce on a simulator → it is NOT a signing issue (simulators don't enforce signatures). Look for a real crash instead.
- Check that every framework in `Frameworks/` is signed by the same Team ID (see the embedded-binary fix page).
- Disable any hot-reload, JIT, or in-process debug tooling and re-build from scratch.
- 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.
- 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.