Swift Testing automated leak checking?

With XCTest I can add an atexit handler to run leaks on the xctest process to check for leaks.

// Only build when built through SPM, as tests run through Xcode don't like this.
// Add LEAKS flag once we figure out a way to automate this.
// Can run by invoking swift test -c debug -Xswiftc -DLEAKS in the Alamofire directory.
// Sample code from the Swift forums: https://forums.swift.org/t/test-for-memory-leaks-in-ci/36526/19
#if SWIFT_PACKAGE && LEAKS && os(macOS)
final class LeaksTests: XCTestCase {
    @MainActor
    func testForLeaks() {
        // Sets up an atexit handler that invokes the leaks tool.
        atexit {
            @discardableResult
            func leaksTo(_ file: String) -> Process {
                let out = FileHandle(forWritingAtPath: file)!
                defer {
                    try! out.close()
                }
                let process = Process()
                process.launchPath = "/usr/bin/leaks"
                process.arguments = ["\(getpid())"]
                process.standardOutput = out
                process.standardError = out
                process.launch()
                process.waitUntilExit()
                return process
            }
            let process = leaksTo("/dev/null")
            guard process.terminationReason == .exit && [0, 1].contains(process.terminationStatus) else {
                print("Process terminated: \(process.terminationReason): \(process.terminationStatus)")
                exit(255)
            }
            if process.terminationStatus == 1 {
                print("================")
                print("Leaks Detected!!!")
                leaksTo("/dev/tty")
            }
            exit(process.terminationStatus)
        }
    }
}
#endif

This works fine and I've used it to find leaks in my code and my tests. However, attempting the same thing for Swift Testing fails due to a restriction on the test helper.

@Suite
struct SwiftTestingLeaksTest {
    @Test
    func forLeaks() {
        // Sets up an atexit handler that invokes the leaks tool.
        atexit {
            @discardableResult
            func leaksTo(_ file: String) -> Process {
                let out = FileHandle(forWritingAtPath: file)!
                defer {
                    try! out.close()
                }
                let process = Process()
                process.launchPath = "/usr/bin/leaks"
                process.arguments = ["\(getpid())"]
                process.standardOutput = out
                process.standardError = out
                process.launch()
                process.waitUntilExit()
                return process
            }
            let process = leaksTo("/dev/null")
            guard process.terminationReason == .exit && [0, 1].contains(process.terminationStatus) else {
                print("Process terminated: \(process.terminationReason): \(process.terminationStatus)")
                exit(255)
            }
            if process.terminationStatus == 1 {
                print("================")
                print("Leaks Detected!!!")
                leaksTo("/dev/tty")
            }
            exit(process.terminationStatus)
        }
    }
}

Process 34426 is not debuggable. Due to security restrictions, leaks can only show or save contents of readonly memory of restricted processes.

Process: swiftpm-testing-helper [34426]

Is there any alternative for Swift Testing?

3 Likes

Hmm, running the test command with sudo does show a leak, but still prints the failure message.

This is a known issue with the code signature on swiftpm-testing-helper. Thanks for the ping!

Edit: Would you mind telling me what version of Xcode you have installed?

This is supposed to be fixed in Xcode versions 16.2 and later. From that version's release notes:

Resolved Issues

  • Fixed an issue where lldb couldn’t attach to the Swift Testing host binary. (136630386)

Echo'ing @grynspan, could you share what Xcode version you are using? Or are you using a Swift.org toolchain by chance? (That should work too, but good to know either way.)

That was with the Xcode 26.3 RC, but it was the same on the other Xcode 26 versions I've tried in the past.

Would you please share the output of these commands run on your Mac?

xcode-select -p
swift --version
1 Like

/Applications/Xcode_26.3.app/Contents/Developer
swift-driver version: 1.127.15 Apple Swift version 6.2.4 (swiftlang-6.2.4.1.4 clang-1700.6.4.2)
Target: arm64-apple-macosx26.0

1 Like

Thank you @Jon_Shier, we investigated further and believe this problem with swiftpm-testing-helper lacking entitlements necessary to allow debugging has reappeared in recent Xcode versions. We are investigating further now; appreciate you bringing it to our attention. (170331271)

4 Likes