Watchdog Terminations

Learn how to turn off Watchdog Termination tracking

This integration tracks watchdog terminations based on heuristics. This feature is available for iOS, tvOS, and Mac Catalyst, works only if the application was in the foreground, and doesn't track watchdog terminations for unit tests.

When a typical unhandled error occurs, the Apple SDK writes a report to disk before the app terminates. It includes the current state of your application with details like the stack trace, tags, breadcrumbs, and so on.

The watchdog terminates your app without notice, which means the SDK can't write a report to disk. A common reason for the watchdog to terminate your app is an Out Of Memory problem.

Note, that there are some security-related types of crashes where the OS immediately terminates the app. These are usually infrequent, and include stack buffer overflows or exceptions with a termination reason related to code signing. Third-party libraries like Sentry can't report these incidents.

Those types of crashes can sometimes be visible in the Xcode Organizer, though. If the app is terminated because it hangs, we won't create a watchdog termination event. An AppHangs event will be created instead.

As a result, in the Apple SDK, we track watchdog terminations during the app start based on heuristics, but getting the state of the app when a watchdog termination occurs is challenging. The SDK adds breadcrumbs to watchdog termination events by appending the breadcrumbs to an open file, which should have a marginal impact on your app's performance. Still, it skips adding some frequently changing context to avoid extra I/O, such as free memory, free storage, device orientation, charging status, battery level, etc.

When a user launches the app, the SDK checks the following statements and reports a watchdog termination if all of them are true:

  • The app didn't crash on the previous run.
  • The app was in the foreground/active.
  • The user launched the app at least once. When your app was killed by the watchdog during the first launch, the SDK can't detect it.
  • There was no debugger attached to the process of the app. (If there was, our logic would falsely report watchdog terminations whenever you restarted the app in development.)
  • The app was not running on a simulator.
  • The OS didn't update your app.
  • The user didn't update the OS of their device.
  • The user didn't terminate the app manually, and neither did the OS.

If you're interested in the implementation details, you can check out the code to find out more.

If you'd like to opt out of this feature, you can do so using options:

Copied
import Sentry

SentrySDK.start { options in
    options.dsn = "___PUBLIC_DSN___"
    options.enableWatchdogTerminationTracking = false
}

If you disable the enableCrashHandler option, the SDK will disable watchdog termination tracking. This will prevent false positive watchdog termination reporting for every crash.

Do watchdog terminations include those due to high memory pressure?

Yes. If the watchdog ends your app due to excessive memory usage, the Apple SDK won’t register it as a crash. Instead, it reports a watchdog termination event the next time your app launches.

Do watchdog terminations include force terminations from the user?

No, watchdog terminations don't include force terminations from the user, because when the user force kills your app, your app goes through the normal termination process, via the applicationWillTerminate delegate method that the Apple SDK also subscribes to. If the user force kills your app while it's hanging, the SDK will report this as a fatal app hang if you have enabled App Hangs V2.

Do watchdog terminations include fatal app hangs?

No, watchdog terminations don't include fatal app hangs.

Was this helpful?
Help improve this content
Our documentation is open source and available on GitHub. Your contributions are welcome, whether fixing a typo (drat!) or suggesting an update ("yeah, this would be better").