Skip to content

Instantly share code, notes, and snippets.

Last active December 8, 2022 15:47
  • Star 16 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save steipete/e15b1fabffc7da7d49c92e3fbd06971a to your computer and use it in GitHub Desktop.
Detect if a process runs under Rosetta 2 on Apple Silicon M1 or native. Works for macOS and iOS.
@objc(PSTArchitecture) class Architecture: NSObject {
/// Check if process runs under Rosetta 2.
/// Use to disable tests that use WebKit when running on Apple Silicon
/// FB8920323: Crash in WebKit memory allocator on Apple Silicon when iOS below 14
/// Crash is in JavaScriptCore: bmalloc::HeapConstants::HeapConstants(std::__1::lock_guard<bmalloc::Mutex> const&)
@objc class var isRosettaEmulated: Bool {
// Issue is specific to Simulator, not real devices
#if targetEnvironment(simulator)
return processIsTranslated() == EMULATED_EXECUTION
return false
/// Test if the process runs natively or under Rosetta
private func processIsTranslated() -> Int32 {
let key = "sysctl.proc_translated"
var ret = Int32(0)
var size: Int = 0
sysctlbyname(key, nil, &size, nil, 0)
let result = sysctlbyname(key, &ret, &size, nil, 0)
if result == -1 {
if errno == ENOENT {
return 0
return -1
return ret
Copy link

@mladenny Thanks, fixed!

Copy link

@steipete I'd be most grateful if you could post the full crash dump, perhaps onto, because I am researching Rosetta 2 crashes with WebKit (and Safari) at the moment for my book (iOS Crash Dump Analysis).

Copy link

Copy link

Deco354 commented Jan 24, 2022

If you're implementing this yourself, don't omit the @objc and NSObject inheritance or you'll get a -1 result from processIsTranslated() every time.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment