Skip to content

[Bug]: OverflowBar crashes immediately on launch on macOS 27.2 (SIGSEGV, stack overflow from recursive Combine update loop) #11

Closed

Description

@Zionfluenza

OverflowBar version

1.5.0 (build 19)

macOS version

27.2 (build 26B123)

Mac and display setup

Mac Studio and

Affected menu bar app

Mac Studio M5 Max, single external 4K monitor (3840×2160 @ 1920×1080 scaled, 60 Hz), no built-in display

Reproduction steps

OverflowBar crashes immediately on launch on macOS 27.2 (SIGSEGV, stack overflow from recursive Combine update loop)

Summary

On macOS 27.2 (build 26B123), OverflowBar 1.5.0 (build 19) and 1.5.1 (build 20) both crash roughly one second after launch, before the UI appears ("flashes then quits"). The crash is a SIGSEGV / EXC_BAD_ACCESS at the main thread's stack guard region — i.e. a stack overflow caused by an infinite recursion. 1.0.19 (build 17) launches and runs normally on the same machine, so the regression was introduced with the new native engine in 1.5.0.

Environment

  • macOS: 27.2 (26B123), arm64 (Apple silicon), Mac Studio (Mac17,14)
  • App: /Applications/OverflowBar.app, bundle id com.overflowbar.mac26.v6, universal (arm64 + x86_64), ad-hoc signed
  • No preferences file existed for the bundle at the time (defaults read com.overflowbar.mac26.v6 → domain not found), so this is the first launch on a clean state, not a corrupt-config case.

Steps to reproduce

  1. Install OverflowBar 1.5.0 or 1.5.1 on macOS 27.2.
  2. Launch it normally (double-click / open).
  3. The icon flashes briefly and the process exits in ~1 second. No UI is ever usable.

Expected

App launches and shows its menu bar item / Settings.

Actual

App crashes within ~1 second, every launch. Reproduced repeatedly (10 crash reports collected across 1.5.0 and 1.5.1).

Version matrix (same machine, macOS 27.2)

Version Build Result
1.5.0 19 Crash (SIGSEGV, stack overflow)
1.5.1 20 Crash (identical signature)
1.0.19 17 Launches and stays running

Note: the 1.5.1 release notes state "macOS 27 runtime behavior remains untested", which matches what we see.

Crash signature (from a 1.5.0 .ips report)

exception:
  type:    EXC_BAD_ACCESS
  signal:  SIGSEGV
  subtype: KERN_PROTECTION_FAILURE at 0x000000016acc3ff8
  message: "Could not determine thread index for stack guard region"

termination:
  indicator: "Segmentation fault: 11"

vmRegionInfo:
  -->  Stack Guard  1674c0000-16acc4000  [ 56.0M] ---/rwx SM=PRV
       Stack        16acc4000-16b4c0000  [ 8176K] rw-/rwx SM=COW

The faulting thread is com.apple.main-thread. The backtrace contains a repeating cycle — the same block of frames repeats ~6 times before hitting the stack guard (truncated excerpt, one iteration):

SwiftUICore  SubscriptionLifetime.shouldAcceptValue(for:)
SwiftUICore  SubscriptionLifetime.Connection.receive(_:)
Combine      ObservableObjectPublisher.Inner.send()
Combine      ObservableObjectPublisher.send()
Combine      PublishedSubject.send(_:)
Combine      closure #1 in static Published.subscript.setter
Combine      specialized static Published.withMutation<A>(of:keyPath:storage:apply:)
Combine      static Published.subscript.setter
OverflowBar  partial apply for closure #1 in MenuBarItemStore.init(preferences:)
OverflowBar  NativeMenuBarEngine.cancel()
OverflowBar  MenuBarItemStore.cancelOperation()
OverflowBar  MenuBarItemStore.setLayoutManagementEnabled(_:)
OverflowBar  StatusBarController.updateDivider()
OverflowBar  partial apply for closure #1 in StatusBarController.init(store:showSettings:)
   ... -> back to "partial apply for closure #1 in MenuBarItemStore.init(preferences:)" and repeats ...

So the cycle is:

StatusBarController.updateDivider()
  -> Combine @Published setter
  -> closure #1 in MenuBarItemStore.init(preferences:)
  -> NativeMenuBarEngine.cancel()
  -> MenuBarItemStore.cancelOperation()
  -> MenuBarItemStore.setLayoutManagementEnabled(_:)
  -> StatusBarController.updateDivider()   (again)

Under lldb, the 1.5.1 build stops at:

stop reason = EXC_BAD_ACCESS (code=2, address=0x16f603fb8)   # address is in the main-thread stack region
frame #0: SwiftUICore`UpdateGroup.begin() + 64

Suspected root cause

StatusBarController.updateDivider() and MenuBarItemStore.setLayoutManagementEnabled(_:) appear to be wired to each other through @Published / Combine subscriptions (the closure #1 in ...init subscribers), with no re-entrancy guard or removeDuplicates() / equality check. Setting one property synchronously publishes to the other, which publishes back — an infinite mutual update loop. On macOS 27 the delivery path goes through SwiftUICore UpdateGroup and re-enters synchronously, so what may have been coalesced/benign on macOS 26 now recurses until the main-thread stack overflows.

Possible fixes to consider: break the cycle with an equality guard / .removeDuplicates() on the relevant publishers, an explicit isUpdating re-entrancy flag, or deferring one direction (e.g. DispatchQueue.main.async / Task { @MainActor in ... }) so the two setters don't call each other synchronously.

Workaround

Rolling back to 1.0.19 (the last pre-native-engine stable, same bundle id com.overflowbar.mac26.v6) runs correctly on macOS 27.2.

Attachments

Two crash reports are available and can be attached:

  • OverflowBar-2026-11-06-192921.ips (1.5.0)
  • OverflowBar-2026-11-06-192912.ips (1.5.0)

(1.5.1 crash reports also exist for build 20 with the same signature.)

Expected behavior

OverflowBar should launch normally, appear in the menu bar, and let me open its Settings panel like on macOS 26.

Actual behavior

OverflowBar crashes about one second after launch, before any UI or menu bar item appears — the icon flashes briefly and the process exits every single time. No window is ever usable.

The crash is EXC_BAD_ACCESS / SIGSEGV (KERN_PROTECTION_FAILURE at the main-thread stack guard region), i.e. a stack overflow from an infinite recursion. The backtrace repeats a Combine @published update cycle among StatusBarController.updateDivider(), MenuBarItemStore.setLayoutManagementEnabled(_:), MenuBarItemStore.cancelOperation() and NativeMenuBarEngine.cancel().

Reproduced on both 1.5.0 (build 19) and 1.5.1 (build 20), same signature. 1.0.19 (build 17) launches and runs fine on the same machine. Full crash reports (.ips) are attached.

Settings → Safe Reset is not reachable because the app crashes at launch, so that check could not be performed.

Checks completed

  • I reproduced this on the latest release.
  • I tried Settings → Safe Reset.
  • I removed private information from attachments.

Activity

  1. added
    bugSomething isn't working
    triageNeeds initial review and prioritization
    on Nov 6, 2026
  2. EvanProgramming commented on Nov 6, 2026

    @EvanProgramming
    Owner

    Thank you for the detailed report and the version comparison. The stack trace points to a synchronous re-entry in the unsupported-OS fallback, and I’m investigating that path and adding regression coverage. My test machine runs macOS 26.4, so I can’t directly test macOS 27. If convenient, please attach a full crash report with private information removed; that would help confirm the diagnosis. I’ll follow up with the results.

  3. EvanProgramming commented on Nov 6, 2026

    @EvanProgramming
    Owner

    Update: I traced a concrete synchronous recursion in the macOS 27 fallback: disabling layout cancels the engine, whose visibility callback can immediately trigger the same disable again. I have a local change that guards that re-entry and prevents unsupported systems from starting layout operations. The macOS 26.4 test suite passes (73 XCTest tests, one skipped, plus 11 Swift Testing tests), including a regression test with a synchronous callback. This is not yet a released or macOS 27-tested fix; I’ll need verification on macOS 27 once a test build is available. Please keep the issue open in the meantime.

  4. EvanProgramming commented on Nov 8, 2026

    @EvanProgramming
    Owner

    The fix for the identified synchronous recursion has been merged in #12. The automated test suite and macOS CI passed, including a regression test for the unsupported-system callback path.

    This change has not been tested on macOS 27, and no release containing it has been published yet. I’m closing this based on the code fix and automated coverage; if the crash persists once a build containing the fix is available, please comment here or open a new issue with a sanitized crash report so we can investigate further. Thank you again for the detailed report.

  5. EvanProgramming commented on Nov 8, 2026

    @EvanProgramming
    Owner

    A preview build containing the startup fix is now available: macOS 27 startup fix preview. Please install it manually from the DMG if you are able to test it, and let us know whether it launches on your Mac. It has not been tested on macOS 27 here, and native icon hiding remains disabled on that version. If it still crashes, a sanitized crash report would be helpful. Thank you!

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingreview: lowghfind author score; see https://ghfind.comtriageNeeds initial review and prioritization

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions