最近遇到这么一个问题,我们app 在iOS14的设备上切到后台就会crash. OK 那我们来调试一下。
首先连上Xcode, 编译切后台来还原crash的经过。 然后crash了。
控制台显示`Message from debugger: Terminated due to signal 9`。并且上边还有`[BackgroundTask] Background task still not ended after expiration handlers were called: <_UIBackgroundTaskInfo: 0x2835e06c0>: taskID = 64, taskName = CCTLogWriter, creationTime = 64357 (elapsed = 0). This app will likely be terminated by the system. Call UIApplication.endBackgroundTask(_:) to avoid this.` 这样一段。很明显了,crash 是由于后台线程没有关闭导致的。那我们怎么定位哪个没关闭呢?只看这log 是看不出来东西的,我们就要用到UIApplicationEndBackgroundTaskError()这个debug调试了。
首先在Xcode顶部找到 View-> Navigators > Show Breakpoint Navigator,然后再添加BreakPoint的地方`Add Symbolic Breakpoint`, symbol处输入UIApplicationEndBackgroundTaskError. 这样就可以了。
然后重新编译,重现crash, 发现断点起作用了。发现问题出在了一个叫 GDTCCTUploader 的upload方法里了。然后发现这是firebase 三方库的东西。更新firebase, ok!
这里再提醒一点,如果用到了UIApplication.shared.beginBackgroundTask. 一定要有对应的UIApplication.shared.endBackgroundTask
网友评论