我有一个来自集成了我们的 Swift SDK 的应用程序的崩溃报告。我能够对其进行符号化,但是当我查看堆栈跟踪中本应属于我们的 SDK 的最后一行代码时,我无法识别它。
(堆栈的其余部分位于 Swift Core 中。混淆名称)
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000a00000008
....
7 libswiftCore.dylib 0x00000001007d337c 0x1005ec000 + 1995644
8 libswiftCore.dylib 0x00000001007d33d4 0x1005ec000 + 1995732
9 OurLib 0x00000001003e1ed0 specialized specialized static Array._allocateBufferUninitialized<A>(Int) -> _ArrayBuffer<A> (TheCrashingClass.swift:0)
10 OurLib 0x0000000100420200 specialized static OurLibClass.(startInternal in _9A5ED0808944BC6425F8A2C348E9DA3A)(delegate : NotificationDelegate?, send : Bool) -> () (OurLibClass.swift:0)
11 OurLib 0x0000000100420a70 specialized static OurLibClass.start(NotificationDelegate?, send : Bool) -> () (OurLibClass.swift:47)
12 OurLib 0x000000010041f5b0 @objc static OurLibClass.start(NotificationDelegate?, send : Bool) -> () (OurLibClass.swift:0)
13 TheApp 0x00000001000f8f3c -[AppDelegate application:didFinishLaunchingWithOptions:] (AppDelegate.m:48)
有问题的行是这一行:
specialized specialized static Array._allocateBufferUninitialized<A>(Int) -> _ArrayBuffer<A> (TheCrashingClass.swift:0)
堆栈跟踪很困惑,因为 OurLibClass 没有调用 TheCrashingClass。客户端确认我们在 start() 调用开始时启用的打印语句没有被打印。这让我认为 CrashingClass 加载时正在调用静态属性/ block 。这是类和属性的精简版本。
public class CrashingClass : IProtocolThree, CustomStringConvertible {
public let description = "ADescription"
private let class1: IProtocolOne
private var class2: IProtocolTwo?
private let defaults: NSUserDefaults
private let key: String
private let class4: IProtocolOne
private let callback: () -> ()
private let class3 = Class3()
public private(set) var interval: NSTimeInterval
public var date2: NSDate? { get { } }
public var date1: NSDate? { get { } }
init(class1: IProtocolOne, defaults: NSUserDefaults, key: String, interval: NSTimeInterval, class4: IProtocolFour, callback: () -> ()) {
}
}
它没有任何数组,我能想到的唯一可以作为数组进行初始化的属性是字符串。
其他一些注意事项: - 我无法在任何设备(真实设备或模拟器)上重现此问题 - 崩溃仅发生在某些设备上,但是当它发生在设备上时,它会持续发生。但是,同一类型的不同设备表现出不同的行为。例如,一台 iPad4 (ios 8.0) 总是崩溃,而另一台 iPad4 (ios 8.1) 则不会。 - 应用程序是 objc,而框架是 Swift
我的问题是:
专用专用静态Array._allocateBufferUninitialized(Int) -> _ArrayBuffer (TheCrashingClass.swift:0)
- 我可以在 allocateBufferUninitialized 处设置一个符号断点,以便我可以看到它是从哪里调用的吗?
- “专门专门”是什么意思?
- 如有任何其他见解,我们将不胜感激。
最佳答案
我无法缩小有问题的代码范围。但是,我发现了问题。
问题是我们的 Swift SDK 是使用 Xcode 7.1(使用 Swift 2.1)构建的,而应用程序是使用 Xcode 7.0(使用 Swift 2.0)构建其应用程序的。如果我们使用相同版本的 Xcode 构建框架,一切都会很好。我对 Apple 非常失望,因为我们不应该在次要版本升级中发现这样的问题。
已提交雷达23338116。
关于arrays - Swift 崩溃 : Array. _allocateBufferUninitialized,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33426618/