如何通过Xcode Organizer无缺失选择器信息的启动崩溃报告定位问题?
嗨,我之前也碰到过这种糟心的情况——App一启动就崩溃,看Xcode Organizer的崩溃报告明明是doesNotRecognizeSelector导致的,但偏偏没显示缺失的选择器,完全摸不着头绪。给你分享几个我亲测有效的排查思路:
先确认崩溃报告是否完整符号化:很多时候是符号化不彻底导致关键信息丢失。你可以手动重新符号化试试:把App对应的
.dSYM文件和崩溃报告放在同一个文件夹里,用atos命令解析崩溃栈里的内存地址。比如先找到崩溃线程里的栈帧地址,然后执行atos -arch <你的App架构,比如arm64> -o <App二进制文件路径> <栈帧地址>,就能还原出具体的代码位置。另外,还要检查Xcode Organizer里是否同步了完整的符号文件,有时候归档时没勾选包含dSYM也会出这个问题。回溯启动流程中的动态调用逻辑:启动阶段的
doesNotRecognizeSelector问题,大概率和KVC/KVO、动态方法调用有关。你可以梳理下application:didFinishLaunchingWithOptions:里的所有操作,有没有用setValue:forKey:这类KVC方法(很可能是属性名写错了),或者有没有给某个对象添加KVO但对象实际没有对应的属性。还可以在Xcode里加个全局异常断点,启动时触发断点后,就能直接定位到抛出异常的代码行,比看崩溃报告直观多了。排查Category的冲突问题:如果最近给系统类加了Category,要小心方法名冲突或者错误调用的情况。比如你给
UIView加了某个Category方法,启动时某个系统初始化流程误判了对象类型,调用了这个不存在的方法。可以临时注释掉最近新增的Category,看看崩溃是否消失,以此来定位问题。逐个排查第三方库:启动崩溃很多时候是第三方SDK的锅。你可以尝试逐个注释掉第三方库的启动代码,看崩溃是否重现。如果找到可疑的库,去看它的初始化逻辑里有没有用
performSelector:这类动态调用方法,很可能是选择器名拼写错误或者参数不匹配导致的。
备注:内容来源于stack exchange,提问作者jdleung

