2020年7月

记录一次iOS 14 上非数字键盘第一相应者导致的崩溃问题

最近通过bugtags错误上报好几个iOS 14 上的崩溃问题,一直找不到崩溃的原因。崩溃信息如下:

Exception Codes: 0x00000000 at 0x0000000000000000
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '[NSXPCConnection sendInvocation]: A NULL reply block was passed into a message meant to be sent over a connection. (generateAutocorrectionsWithKeyboardState:candidateRange:requestToken:completionHandler:)'

根据错误日志也无法分享出具体错误信息,于是找了台设备升级到iOS 14 bata2,发现这在iOS 14上是一个必现的问题,只要是非数字键盘,在键盘成为第一响应者时就会导致崩溃。排查了很久,发现在 debug 模式下不会产生,在 release 模式下是必现,于是想到了 runtime 对错误信息的hook,尝试注释掉相关的runtime,果然不会导致崩溃问题,然后采用折半查找法,排查到是以前对一个键盘问题的处理方法导致的:

Method methodSignatureForSelector = class_getInstanceMethod(self, @selector(methodSignatureForSelector:));
Method customMethodSignatureForSelector = class_getClassMethod(self, @selector(customMethodSignatureForSelector:));
method_exchangeImplementations(methodSignatureForSelector, customMethodSignatureForSelector);

该方法在针对键盘的特定事件进行过重写,导致在iOS 14 上键盘成为第一响应者时导致崩溃。

使用命令行解析bugly下iOS APP的崩溃日志

这几天 bugly 日志平台出现故障,无法解析iOS 用户上报的崩溃日志。无奈,只能使用最原始的命令行来解析日志信息。
首先我们需要准备好崩溃日志对应的 dSYM 文件。

  • 打开终端,执行命令 xcrun atos -o appName.app.dSYM/Contents/Resources/DWARF/appName -l 模块加载地址 第二个地址
  • 回车。稍等片刻就能看到错误具体信息流。

地址说明

Link:

  • [命令行工具atos解析iOS app的崩溃日志(bugly)]