Swift 崩溃 libobjc.A.dylib objc_msgSend
Posted
技术标签:
【中文标题】Swift 崩溃 libobjc.A.dylib objc_msgSend【英文标题】:Swift Crash libobjc.A.dylib objc_msgSend 【发布时间】:2016-06-20 13:26:21 【问题描述】:我使用 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 团队,他们告诉我以下内容:
听起来这个崩溃的根源是某种内存不足的崩溃。这会导致 Crashlytics 在完成写入之前关闭,从而导致您的崩溃报告中出现这种情况。
有什么好的方法来调试它以查明崩溃的根源吗?感谢您的帮助!
编辑: 在 crashlytics 的崩溃报告中添加了线程的屏幕截图,以防有人想从那里获取一些信息:
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
问题是我无法在本地重现任何崩溃。只有用户面临这个问题。我以类似的方式调用选择器。
【问题讨论】:
崩溃没有更多信息或控制台输出? 添加了其他线程运行的截图(我只复制了主线程的信息)。这就是我可以从崩溃报告中得到的全部信息。检查编辑的问题 【参考方案1】:objc_msgSend
崩溃发生在您尝试将消息转发到选择器时(使用旧的 Objective-C 转发消息传递)。这可以由目标操作、通知、协议声明、计时器、执行选择器或任何其他涉及传入函数选择器语法的函数产生:即:"doSomethingWithThis:"
。
我可以从您的崩溃日志中看到,您的应用中有 swift 组件(至少是 AppDelegate)。与 Obj-C 组件不同,Swift 组件与开箱即用的 Obj-C 转发消息系统不兼容。
我的直觉是,您的代码中有一个符合协议的 swift 对象,被添加为目标/通知观察者,或者以某种方式期望其函数之一被转发消息调用。我建议你通过你的课程,看看是否是这种情况。找到罪魁祸首后,您可以通过将 @objc 附加到期望消息的函数来轻松修复此错误。
即: 如果您的函数在 swift 类中被调用(例如,为通知注册):
func yourFunction()
//your code
叫它:
@objc func yourFunction()
//your code
这是一个很长的镜头,但我希望这会有所帮助!
【讨论】:
有趣!今晚下班回来看看这个,谢谢建议 我很想知道这是否有帮助! 所以问题是我无法在本地重现我的崩溃,只有用户出于某种原因面临这种情况,所以我不确定这是否能解决我的问题。我编辑了这个问题来回答你。 奖励你赏金,因为你提供了一个很好的答案,这是唯一的答案 anws :) 非常感谢!很抱歉听到它没有那么有用。【参考方案2】:我相信这可能与 AVAudioPlayer 有关。就我而言,我遇到了同样的错误,并通过注意到我正在运行的 2 个线程具有与 AVAudioPlayer 相关的内容而得到了一些提示。
我有一个 AVAudioPlayer 类变量,我在没有先重置为零的情况下重新初始化了它。我在我的 AVAudioPlayer 变量初始化之前添加了下面的代码,此后该错误就没有发生过。
audioPlay
是变量名。
if audioPlay != nil
//print( "blabla" )
audioPlay?.stop()
audioPlay = nil
【讨论】:
以上是关于Swift 崩溃 libobjc.A.dylib objc_msgSend的主要内容,如果未能解决你的问题,请参考以下文章