问题描述
我使用 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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!