Swift 崩溃 libobjc.A.dylib objc_msgSend

Swift Crash libobjc.A.dylib objc_msgSend

我使用 crashlytics 来获取我在 AppStore 中的应用程序的崩溃。有些用户遇到崩溃,我似乎无法在我的机器上重现(少数通过 TestFlight 测试我的应用程序的朋友也没有)。这是来自 Fabric 的日志:

Thread : Crashed: com.apple.main-thread
0  libobjc.A.dylib                0x181d09bdc objc_msgSend + 28
1  Foundation                     0x18304be20 __NSThreadPerformPerform + 340
2  CoreFoundation                 0x182640efc __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24
3  CoreFoundation                 0x182640990 __CFRunLoopDoSources0 + 540
4  CoreFoundation                 0x18263e690 __CFRunLoopRun + 724
5  CoreFoundation                 0x18256d680 CFRunLoopRunSpecific + 384
6  GraphicsServices               0x183a7c088 GSEventRunModal + 180
7  UIKit                          0x1873e4d90 UIApplicationMain + 204
8  <App Name>                     0x1000b2f0c main (AppDelegate.swift:14)
9  libdispatch.dylib              0x18210e8b8 (Missing)

我似乎无法理解这意味着什么,并搜索了其他问题以寻求帮助,但似乎找不到答案。我也很快联系了 Crashlytics 团队,他们告诉我以下内容:

It sounds like the source of this crash is some sort of out of memory crash. This causing Crashlytics to close before it finishes writing, resulting in this in your crash report.

有什么好方法可以调试它以查明崩溃的根源吗?感谢您的帮助!

编辑: 在 crashlytics 的崩溃报告中添加了 Threads 的屏幕截图,以防有人想从那里获取一些信息:

Thread : com.apple.NSURLConnectionLoader
0  libsystem_kernel.dylib         0x1823354bc mach_msg_trap + 8
1  libsystem_kernel.dylib         0x182335338 mach_msg + 72
2  CoreFoundation                 0x182764ac0 __CFRunLoopServiceMachPort + 196
3  CoreFoundation                 0x1827627c4 __CFRunLoopRun + 1032
4  CoreFoundation                 0x182691680 CFRunLoopRunSpecific + 384
5  CFNetwork                      0x182e01434 +[NSURLConnection(Loader) _resourceLoadLoop:] + 412
6  Foundation                     0x18316fc40 __NSThread__start__ + 1000
7  libsystem_pthread.dylib        0x182417b28 _pthread_body + 156
8  libsystem_pthread.dylib        0x182417a8c _pthread_body + 154
9  libsystem_pthread.dylib        0x182415028 thread_start + 4

Thread : AVAudioSession Notify Thread
0  libsystem_kernel.dylib         0x1823354bc mach_msg_trap + 8
1  libsystem_kernel.dylib         0x182335338 mach_msg + 72
2  CoreFoundation                 0x182764ac0 __CFRunLoopServiceMachPort + 196
3  CoreFoundation                 0x1827627c4 __CFRunLoopRun + 1032
4  CoreFoundation                 0x182691680 CFRunLoopRunSpecific + 384
5  libAVFAudio.dylib              0x188959834 GenericRunLoopThread::Entry(void*) + 164
6  libAVFAudio.dylib              0x18892e3a8 CAPThread::Entry(CAPThread*) + 84
7  libsystem_pthread.dylib        0x182417b28 _pthread_body + 156
8  libsystem_pthread.dylib        0x182417a8c _pthread_body + 154
9  libsystem_pthread.dylib        0x182415028 thread_start + 4

编辑 2: 我正在使用所有 Swift 代码,我将消息转发给选择器的方式如下:

NSTimer.scheduledTimerWithTimeInterval(0.02, target: self, selector: Selector("updateProgressCircle"), userInfo: nil, repeats: true)

func updateProgressCircle() {
   // Do something
}

问题是我无法在本地重现任何崩溃。只有用户会面临这种情况。我以类似的方式调用选择器。

当您尝试将消息转发给选择器(使用旧的 Objective-C 转发消息)时,会发生 objc_msgSend 崩溃。这可以通过目标操作、通知、协议声明、计时器、执行选择器或涉及传递函数选择器语法的任何其他函数产生:即:"doSomethingWithThis:"

我可以从您的崩溃日志中看到您的应用程序中有 swift 个组件(至少是 AppDelegate)。 Swift 组件与 Obj-C 组件不同,不兼容开箱即用的 Obj-C 转发消息系统。

我的直觉是你的代码中有一个符合协议的 swift 对象,被添加为 target/notification 观察者,或者以某种方式期望它的一个函数被调用转发消息。我建议你检查一下你的 classes 看看是否是这种情况。找到罪魁祸首后,您可以通过将 @objc 附加到需要消息的函数来轻松修复此错误。

即: 如果您的函数在 swift class 中被调用(并且注册通知):

func yourFunction() {
   //your code
}

称之为:

@objc func yourFunction() {
  //your code
}

希望不大,但希望对您有所帮助!

我相信这可能与 AVAudioPlayer 有关。在我的例子中,我遇到了同样的错误,并通过注意到我的 运行 线程中的 2 个具有与 AVAudioPlayer 相关的内容而得到了一些提示。

我有一个 AVAudioPlayer class 变量,我没有先重置为 nil 就重新初始化了它。我在我的 AVAudioPlayer 变量初始化之前添加了下面的代码,此后错误没有发生。

audioPlay是变量名。

if audioPlay != nil
{
    //print( "blabla" )
    audioPlay?.stop()
    audioPlay = nil
}