老项目运行时Xcode控制台出现主线程调用警告,无法定位报错来源求助
解决主线程警告定位问题的实用思路
设置符号断点追踪调用栈
这个警告是通过日志输出的,直接给日志输出方法加符号断点:- 在Xcode断点导航栏点击
+,选择Symbolic Breakpoint - 符号栏填
NSLog(如果是系统用os_log输出就填os_log) - 运行项目,当警告输出时断点会触发,查看调用栈里的非系统代码部分,就能找到触发警告的位置
- 在Xcode断点导航栏点击
用Instruments监控主线程操作
打开Xcode的Product > Profile,选择Thread工具启动监控:- 项目运行后,当控制台出现警告时,暂停Instruments,查看主线程的调用栈,定位耗时操作的代码位置
全局搜索高风险方法
直接在项目里搜索常见的会触发主线程警告的方法关键词,比如:dataWithContentsOfURL、synchronous(同步网络请求)performBlockAndWait(CoreData同步操作)- 大量循环计算、文件读写的方法
这些都是旧项目里容易在主线程执行的耗时操作,大概率是警告来源
运行Xcode静态分析工具
执行Product > Analyze,在分析结果里筛选Performance分类,Xcode会自动检测出主线程中执行的耗时操作,直接定位代码位置Hook日志输出打印调用栈
如果上面的方法都没效果,可以用Runtime Hook日志输出方法,在警告出现时打印完整调用栈:
比如给NSLog写个分类,拦截输出,当内容包含This method should not be called on the main thread时,打印[NSThread callStackSymbols],就能拿到触发警告的代码路径
内容的提问来源于stack exchange,提问作者闪电狮
相关产品推荐
相关产品推荐

