一个 Mach 异常处理程序,用 Swift 和 Objective-C 编写,允许捕获并测试由 Swift 的 assertionFailure
/preconditionFailure
/fatalError
触发的 EXC_BAD_INSTRUCTION
。
注意:iOS 代码仅在模拟器中运行 仅。它用于逻辑测试,由于 Mach 异常 API 在 iOS 中是私有的,因此不能部署到设备上。
关于该代码的更深入讨论,请参阅 Cocoa with Love 文章
从 2.0.0-beta.1 版本开始,构建 CwlPreconditionTesting 需要 Swift 5 或更高版本,以及 Swift 包管理器或 CocoaPods。
对于使用较旧版本的 Swift 或其他包管理器,请使用版本 1.2.0 或更旧版本use version 1.2.0 or older.
将以下内容添加到 "Package.swift" 文件中的 dependencies
数组中
.package(url: "https://github.com/mattgallagher/CwlPreconditionTesting.git", from: Version("2.0.0"))
或者通过将 https://github.com/mattgallagher/CwlPreconditionTesting.git
、版本 2.0.0 或更高版本添加到 Xcode 中任何项目的 Swift 包列表中。
CocoaPods 是一个 Cocoa 项目的依赖项管理器。有关用法和安装说明,请访问他们的网站。要使用 CocoaPods 将 CwlPreconditionTesting 集成到您的 Xcode 项目中,在 Podfile 中指定它
pod 'CwlPreconditionTesting', '~> 2.0'
在 macOS 和 iOS 上,您可以使用常规版本
import CwlPreconditionTesting
let e = catchBadInstruction {
precondition(false, "THIS PRECONDITION FAILURE IS EXPECTED")
}
在 tvOS、Linux 和其他平台上,您可以使用 POSIX 版本
import CwlPosixPreconditionTesting
let e = catchBadInstruction {
precondition(false, "THIS PRECONDITION FAILURE IS EXPECTED")
}
警告:此 POSIX 版本无法在附加了 lldb 时使用,因为 lldb 的 Mach 异常处理程序会阻止 SIGILL 发生。您应该在 Xcode 中禁用测试的“调试可执行文件”设置。信号处理器的 POSIX 版本也是整个进程(而不是正确作用域到发生“捕获”的线程)。
感谢 @abbeycode, @dnkoutso, @jeffh 和 @ikesyo 的贡献。还需要感谢 @saagarjha 在 ARM64 增加方面的帮助。