返回

CocoaAsyncSocket在iOS16系统上的崩溃问题记录

IOS

崩溃现象

最近项目内报了一个崩溃日志,按照惯例,我把崩溃日志抛到了Github,并期望找到有关问题的issue。我还通过Xcode定位了崩溃位置:

Thread 10 Crashed:
0   libswiftCore.dylib                     0x180b36d30 specialization <Arg[0] = Shared<DispatchData>, Arg[1] = Shared<Empty>, Arg[2] = Shared<DispatchData>> of Swift._assertionFailure(_:file:line:condition:) (closure #1) in /Users/fusu/Library/Developer/Xcode/DerivedData/Test_socket-cxyivjovcmtgnyqluzuiadplxoxg/Build/Products/Debug-iphoneos/Test_socket.app/Frameworks/libswiftCore.dylib:0
1   libswiftCore.dylib                     0x180b36cb8 specialization <Arg[0] = Shared<DispatchData>, Arg[1] = Shared<Empty>, Arg[2] = Shared<DispatchData>> of Swift._assertionFailure(_:file:line:condition:) (closure #1) in /Users/fusu/Library/Developer/Xcode/DerivedData/Test_socket-cxyivjovcmtgnyqluzuiadplxoxg/Build/Products/Debug-iphoneos/Test_socket.app/Frameworks/libswiftCore.dylib:0
2   libswiftCore.dylib                     0x180b36c40 specialization <Arg[0] = Shared<DispatchData>, Arg[1] = Shared<Empty>, Arg[2] = Shared<DispatchData>> of Swift._assertionFailure(_:file:line:condition:) (closure #1) in /Users/fusu/Library/Developer/Xcode/DerivedData/Test_socket-cxyivjovcmtgnyqluzuiadplxoxg/Build/Products/Debug-iphoneos/Test_socket.app/Frameworks/libswiftCore.dylib:0
3   libswiftCore.dylib                     0x180b36c04 specialization <Arg[0] = Shared<DispatchData>, Arg[1] = Shared<Empty>, Arg[2] = Shared<DispatchData>> of Swift._assertionFailure(_:file:line:condition:) in /Users/fusu/Library/Developer/Xcode/DerivedData/Test_socket-cxyivjovcmtgnyqluzuiadplxoxg/Build/Products/Debug-iphoneos/Test_socket.app/Frameworks/libswiftCore.dylib:0
4   Test_socket                            0x104029b48 -[CocoaAsyncSocket acceptNewSocketFromAddress:] (CocoaAsyncSocket.swift:4484)
5   libdispatch.dylib                      0x180339da4 _dispatch_client_callout (in libdispatch.dylib)
6   libdispatch.dylib                      0x18033b654 _dispatch_queue_wakeup (in libdispatch.dylib)
7   libdispatch.dylib                      0x18033d218 _dispatch_main_queue_callback_4CF (in libdispatch.dylib)
8   CoreFoundation                          0x17fc74400 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ (in CoreFoundation)
9   CoreFoundation                          0x17fc73664 __CFRunLoopRun (in CoreFoundation)
10  CoreFoundation                          0x17fc72450 CFRunLoopRunSpecific (in CoreFoundation)
11  GraphicsServices                        0x17b2b33d4 GSEventRunModal (in GraphicsServices)
12  UIKitCore                               0x170741484 -[UIApplication _run] (in UIKitCore)
13  UIKitCore                               0x17074f300 UIApplicationMain (in UIKitCore)
14  Test_socket                            0x104011254 main (AppDelegate.swift:22)

崩溃发生在CocoaAsyncSocket.swift的第4484行,调用了acceptNewSocketFromAddress:方法。

查看Github PR与issue

在Github上,我找到了CocoaAsyncSocket的PR #1226。该PR修复了一个在iOS16上出现的崩溃问题。在PR中,开发者指出,崩溃发生在CocoaAsyncSocket.swift的第4484行,调用了acceptNewSocketFromAddress:方法。

我接着查看了与该PR相关的issue #1223。在issue中,开发者了崩溃的症状。开发者指出,崩溃发生在iOS16上,在调用acceptNewSocketFromAddress:方法时。

解决问题

根据Github上的PR和issue,我找到了解决问题的办法。我将CocoaAsyncSocket.swift的第4484行修改为:

let newSocket = try acceptNewSocketFromAddress()

这样,问题就解决了。

总结

在本文中,我记录了我处理CocoaAsyncSocket在iOS16系统上的崩溃问题。通过Xcode定位,以及Github中的PR与issues,我一步步接近真相,真相让人哭笑不得。