2.6.0
[!NOTE] KSCrash 2.6.0 is fully backward-compatible with 2.5.1: no source-breaking changes, and all renamed or removed APIs keep working as deprecated aliases. The Migration Guide covers everything that changed and how to adopt the new features.
- Watchdog monitor: detects main-thread hangs using run-loop observation and a 250ms threshold matching Apple's hang definition, with full backtraces, recovery tracking, and optional non-fatal reports for recovered hangs. Replaces the deprecated Deadlock monitor.
- Termination monitor: detects OS-level terminations that can't be caught at runtime (OOM, thermal, CPU watchdog, reboots, OS/app upgrades), and
previousTerminationReasonreports why the previous run ended. - CPU tracker: sliding-window CPU state tracking that mirrors Apple's enforcement thresholds, with optional non-fatal EXC_RESOURCE reports on state transitions.
- Per-key user info: an async-signal-safe, mmap'd key-value store with zero crash-time overhead, replacing the deprecated dictionary userInfo property.
- Swift modules:
Report(strongly-typed CrashReport model for parsing reports),Monitors(MetricKit plugin), andProfiler(sampling profiler). - Plus a plugin monitor API, direct backtrace capture API, threadcrumbs, compact binary images, opt-in Swift async stack traces, and a long list of crash-time correctness and hardening fixes.
The CHANGELOG has the complete list of features, deprecations, behavioral changes, and bug fixes.
Full Changelog: https://github.com/kstenerud/KSCrash/compare/2.5.1...2.6.0
2.6.0-beta.5
[!NOTE] Please review this page in the wiki for a deeper dive into all the changes.
[!NOTE] We're naming this v2.6.0 to be clear that we expect it to be 100% compatible, non-source breaking with v2.5.1. Please report any issues you may find.
- Track stack overflow on the stack cursor by @naftaly in https://github.com/kstenerud/KSCrash/pull/877
- Add Xcode 27 support to CI workflows by @naftaly in https://github.com/kstenerud/KSCrash/pull/868
- Add Swift async self-thread stack capture option by @supervacuus in https://github.com/kstenerud/KSCrash/pull/878
- Fix arm64 symbolication of Swift async continuation frames by @GLinnik21 in https://github.com/kstenerud/KSCrash/pull/879
Full Changelog: https://github.com/kstenerud/KSCrash/compare/2.6.0-beta.4...2.6.0-beta.5
v4.5.4
-
Implemented the automatic interaction style
- The automatic interaction style lets the system handle interactions, and may choose different interaction styles for opening and closing the popup
- Not yet enabled by default; set
popupPresentationContainerController.popupInteractionStyle = .automaticto enable
-
Catalyst improvements
v4.5.3
- Enabled
popupBarAvoidsPrimaryColumnandpopupOpensOverSplitViewControllerby default on all device types- To revert to the previous behavior, set them to false on the respective popup presentation container controller
-
popupBarAvoidsPrimaryColumnandpopupOpensOverSplitViewControllerare no longer limited to iOS 26 or 27 - Reworked bar and content view close button metrics on iOS 27
- Bar metrics gated behind
inheritsBottomBarMetrics, which is enabled by default
- Bar metrics gated behind
- Some layout improvements
- Fixed compiler warnings for really old iOS versions (iOS 13..<15)
v4.5.2
This is a very big release, with many improvements.
- Many layout improvements to the popup bar and how it handles the countless variations of bar buttons
- Fixes to complex RTL layouts
- Catalyst and iPad are now much better supported, with layouts that were previously not possible
- The
LNPopupItem.leadingBarButtonItemsandLNPopupItem.trailingBarButtonItemsAPIs have been undeprecated and it is now possible to place leading and trailing buttons on any bar style - The
LNPopupItem.barButtonItemswill continue to place items at the trailing edge; however, if you were relying on the previous behaviur, whereLNPopupItem.leadingBarButtonItemswould be placed in the trailing items on floating bars, this is no longer the case
- The
- If too many buttons are placed in a bar item and there is no space for the image and/or titles, the popup bar will hide elements to make space available for buttons
- This is especially important in freely resizeable environments, such as iPads, Mac windows and … future iPhone devices
- Use the new
LNPopupBar.effectiveContentSizeAPI to inspect the effect size of the popup bar content and reduce the number of buttons depending on available space
- Escape key now closes the popup in most scene environments
- Some more complex scenes cannot be supported since the popup might be opened in a controller that is not in the responder chain
- In these cases, route the keys yourself or make the view controller the first responder
- Catalyst now has first-class support and a new example project
- New APIs introduced to better support split view controllers on large devices
UISplitViewController.popupBarAvoidsPrimaryColumnAPI has been introduced to better supprot environments where a popup is presented with the split view controller as the popup presentation controller- When enabled, the system will attempt to avoid the primary split and move the popup bar out of the way
- The popup will continue to open over the entire split view controller’s bounds
- Enabed by default
UIViewController.popupOpensOverSplitViewControllerAPI has been introduced to better support environments where a popup is presented by a popup presentation controller that is part of a split view controller scene- When enabled, the system will open the popup over the entire split view controller’s view bounds rather than only within the specific split
- This is enabled by default on Catalyst but disabled on iOS (to preserve previous behavior)
- The popup bar will remain within the containing view controller’s bounds
- The two new APIs can result in a similar looking behavior from the user’s standpoint, but offer different benefits and tradeoffs; consider first presenting your popup bar over the split view controller
2.6.0-beta.4
[!NOTE] Please review this page in the wiki for a deeper dive into all the changes.
[!NOTE] We're naming this v2.6.0 to be clear that we expect it to be 100% compatible, non-source breaking with v2.5.1. Please report any issues you may find.
- ci: bump actions/dependency-review-action from 4 to 5 in the github-actions group by @dependabot in https://github.com/kstenerud/KSCrash/pull/839
- ci: skip Public API Diff for PRs targeting develop by @naftaly in https://github.com/kstenerud/KSCrash/pull/843
- ci: only run Public API Diff against stable bases (master + release/*) by @naftaly in https://github.com/kstenerud/KSCrash/pull/844
- Fix the Thread Sanitizer CI job failures by @naftaly in https://github.com/kstenerud/KSCrash/pull/858
- Diagnose crashes on the Objective-C nonatomic-property race sentinel by @naftaly in https://github.com/kstenerud/KSCrash/pull/859
- fix: use binary image cache for system binary CPU metadata by @supervacuus in https://github.com/kstenerud/KSCrash/pull/857
- fix: Honor SIG_IGN when installing signal monitor by @supervacuus in https://github.com/kstenerud/KSCrash/pull/856
- Use effective monitor mask when registering monitors by @supervacuus in https://github.com/kstenerud/KSCrash/pull/863
- Preserve the link register value the LR frame consumed by @naftaly in https://github.com/kstenerud/KSCrash/pull/869
- Bound the eh_frame reads that take their length from the section by @naftaly in https://github.com/kstenerud/KSCrash/pull/871
- Guard ksthread_getQueueName against non-positive buffer lengths by @naftaly in https://github.com/kstenerud/KSCrash/pull/874
- Fail the compact unwind lookup at the index sentinel by @naftaly in https://github.com/kstenerud/KSCrash/pull/870
- Use strlcpy for NULL-terminated string copies by @naftaly in https://github.com/kstenerud/KSCrash/pull/875
- Fill the unwind info out-param when the image cache is full by @naftaly in https://github.com/kstenerud/KSCrash/pull/872
Full Changelog: https://github.com/kstenerud/KSCrash/compare/2.6.0-beta.3...2.6.0-beta.4
v4.5.5
Continued improvements to layout and transitions
Release notes from recent updates:
This is a very big release, with many improvements.
- Many layout improvements to the popup bar and how it handles the countless variations of bar buttons
- Fixes to complex RTL layouts
- Catalyst and iPad are now much better supported, with layouts that were previously not possible
- The
LNPopupItem.leadingBarButtonItemsandLNPopupItem.trailingBarButtonItemsAPIs have been undeprecated and it is now possible to place leading and trailing buttons on any bar style - The
LNPopupItem.barButtonItemswill continue to place items at the trailing edge; however, if you were relying on the previous behaviur, whereLNPopupItem.leadingBarButtonItemswould be placed in the trailing items on floating bars, this is no longer the case
- The
- If too many buttons are placed in a bar item and there is no space for the image and/or titles, the popup bar will hide elements to make space available for buttons
- This is especially important in freely resizeable environments, such as iPads, Mac windows and … future iPhone devices
- Use the new
LNPopupBar.effectiveContentSizeAPI to inspect the effect size of the popup bar content and reduce the number of buttons depending on available space
- Escape key now closes the popup in most scene environments
- Some more complex scenes cannot be supported since the popup might be opened in a controller that is not in the responder chain
- In these cases, route the keys yourself or make the view controller the first responder
- Catalyst now has first-class support and a new example project
- New APIs introduced to better support split view controllers on large devices
UISplitViewController.popupBarAvoidsPrimaryColumnAPI has been introduced to better supprot environments where a popup is presented with the split view controller as the popup presentation controller- When enabled, the system will attempt to avoid the primary split and move the popup bar out of the way
- The popup will continue to open over the entire split view controller’s bounds
- Enabed by default
UIViewController.popupOpensOverSplitViewControllerAPI has been introduced to better support environments where a popup is presented by a popup presentation controller that is part of a split view controller scene- When enabled, the system will open the popup over the entire split view controller’s view bounds rather than only within the specific split
- This is enabled by default on Catalyst but disabled on iOS (to preserve previous behavior)
- The popup bar will remain within the containing view controller’s bounds
- The two new APIs can result in a similar looking behavior from the user’s standpoint, but offer different benefits and tradeoffs; consider first presenting your popup bar over the split view controller
v4.5.4
Continued improvements to layout and transitions
Release notes from recent updates:
This is a very big release, with many improvements.
- Many layout improvements to the popup bar and how it handles the countless variations of bar buttons
- Fixes to complex RTL layouts
- Catalyst and iPad are now much better supported, with layouts that were previously not possible
- The
LNPopupItem.leadingBarButtonItemsandLNPopupItem.trailingBarButtonItemsAPIs have been undeprecated and it is now possible to place leading and trailing buttons on any bar style - The
LNPopupItem.barButtonItemswill continue to place items at the trailing edge; however, if you were relying on the previous behaviur, whereLNPopupItem.leadingBarButtonItemswould be placed in the trailing items on floating bars, this is no longer the case
- The
- If too many buttons are placed in a bar item and there is no space for the image and/or titles, the popup bar will hide elements to make space available for buttons
- This is especially important in freely resizeable environments, such as iPads, Mac windows and … future iPhone devices
- Use the new
LNPopupBar.effectiveContentSizeAPI to inspect the effect size of the popup bar content and reduce the number of buttons depending on available space
- Escape key now closes the popup in most scene environments
- Some more complex scenes cannot be supported since the popup might be opened in a controller that is not in the responder chain
- In these cases, route the keys yourself or make the view controller the first responder
- Catalyst now has first-class support and a new example project
- New APIs introduced to better support split view controllers on large devices
UISplitViewController.popupBarAvoidsPrimaryColumnAPI has been introduced to better supprot environments where a popup is presented with the split view controller as the popup presentation controller- When enabled, the system will attempt to avoid the primary split and move the popup bar out of the way
- The popup will continue to open over the entire split view controller’s bounds
- Enabed by default
UIViewController.popupOpensOverSplitViewControllerAPI has been introduced to better support environments where a popup is presented by a popup presentation controller that is part of a split view controller scene- When enabled, the system will open the popup over the entire split view controller’s view bounds rather than only within the specific split
- This is enabled by default on Catalyst but disabled on iOS (to preserve previous behavior)
- The popup bar will remain within the containing view controller’s bounds
- The two new APIs can result in a similar looking behavior from the user’s standpoint, but offer different benefits and tradeoffs; consider first presenting your popup bar over the split view controller