本文介绍了Swift 崩溃 libobjc.A.dylib objc_msgSend的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I use crashlytics to get the crashes of my app that is in the AppStore. Some users are getting a crash that I cannot seem to repro on my machine (neither the few friends that tested my app through TestFlight). This is the logs from 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 团队,他们告诉我以下内容:

I can't seem to understand what this means and searched other questions for help but can't seem to find an answer. I also quickly contacted the Crashlytics team, and they told me the following:

听起来这个崩溃的根源是某种内存不足的崩溃.这会导致 Crashlytics 在完成写入之前关闭,从而导致您的崩溃报告中出现这种情况.

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

Any nice ways to debug this in order to pinpoint the source of the crash? Appreciate the help!

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

Added screenshot of Threads in the crash report from crashlytics in case someone wants some info from there:

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 代码,我将消息转发到选择器的方式如下:

EDIT 2:I am using all Swift code, and the way I am forwarding a messages to Selectors is the following:

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

func updateProgressCircle() {
   // Do something
}

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

Problem is that I can't repro any crash from this locally. Only users are facing that. I call selectors in a similar fashion.

推荐答案

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

An objc_msgSend crash happens when you try to forward a message to a selector (using good old Objective-C forward messaging). This can be produced by target-action, notifications, protocol declarations, timers, perform selectors or any other function that involves passing in a function's selector syntax: i.e: "doSomethingWithThis:".

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

I can see from your crash logs that you have swift components in your app (at least the AppDelegate). Swift components, unlike Obj-C components, aren't compatible with the Obj-C forward messaging system out of the box.

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

My gut feeling is that you have a swift object in your code that conforms to a protocol, is added as a target/notification observer or is somehow expecting one of its functions to be called by forward messaging. I suggest you go through your classes and see if this is the case. Once you find the culprit you can easily fix this error by appending @objc to the function expecting the message.

即:如果您的函数在 swift 类中被调用(例如,为通知注册):

i.e:if your function, in a swift class is called (and is, say, registered for a notification):

func yourFunction() {
   //your code
}

叫它:

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

这是一个很长的镜头,但我希望这会有所帮助!

It's a long shot but I hope this helps!

这篇关于Swift 崩溃 libobjc.A.dylib objc_msgSend的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-17 09:36
查看更多