[iOS] Xcode调试技巧 & 弱网等

很懒的我决定把之前的杂项分个类了...

目录:

  1. Xcode快捷键
  2. 调试看到都是nil,print告诉你variable not available
  3. 模拟弱网调试
  4. 控制台看log
  5. 内存泄漏 Memory Graph
  6. crash log符号化
  7. Xcode模拟定位
  8. Instruments性能检测
  9. 筛选编译错误

1. Xcode快捷键

快速查找类:command+shift+o
一秒格式化:ctrl + i (注意command + i 是profile哦)
一秒多行注释:command + option + /
快速在左侧文件树中显示当前文件位置:command + shift + j


2. 调试看到都是nil,print告诉你variable not available

把优化等级改为none就好啦~


image

3. 模拟弱网调试

可参考:https://www.jianshu.com/p/b52448f56c96

这周的一个需求和弱网有关,以前都是用Charles的throttle来模拟弱网的,但是其实iOS自身手机上就可以选弱网模拟哦~

打开settings->developer->network link conditioner->very bad network即可:


弱网设置
  • 这里每个参数的含义大致如下:

in bandwidth 下行带宽即下行速率,是指网络向用户电脑发送信息时的传输速率,例如下载速度
in packet loss 下行丢包率丢失数据包数量占所发送数据组的比率
in delay 下行延迟,单位为ms收到数据包晚一会给自己用
out bandwidth 上行带宽上传数据速度
out packet loss 上行丢包率
out delay 上行延迟
DNS delay DNS解析延迟,这个功能安卓不知道怎么模拟
protocol 协议,可选Any,IPv4,IPv6
interface 接口,可选ALL,Wi-Fi,cellular(蜂窝网)

  • Tips:

Charles throttle只能hook http协议的网络请求,但是有些网络传输是基于RTMP,所以Charles不能控制这类请求的网速,因为Charles是一个HTTP代理服务器,所以这种情景只能用手机自身的网络限速。

那么如果Android也想限速怎么办呢?测试小姐姐通过让Android机连iOS的代理,iOS开启网络限速来实现滴~


4. 控制台看log

有的时候测试小姐姐需要验证一些东西,但是又不能xcode断点或者日志看,就可以用到控制台啦~

以及debug冷启动的push之类的时候不能打断点,就可以通过log来看了

下面是我手机控制台的日志,可以看到wechat之类的日志,这里的日志也是可以搜索的哦~


控制台

那我们要干点什么来让app能在控制台打log呢?
其实直接NSLog就可以啦~~


5. 内存泄漏 Memory Graph

内存泄漏的检查工具有好多啦,例如MLeaksFinder之类的,但是除了形成了cycle互相持有的那种,其他如果单纯知道了某个对象leak了,如何知道是什么持有了它呢?

Xcode有个很好用的工具,就是Memory Graph,可以看到现在的各种对象的持有关系:


memory graph

通过这个东东就能从左边找到你想知道有木有泄漏的对象(filter),然后右边就会出现它的持有关系啦~ 是不是超级棒!!

--

6. crash log符号化

参考:https://www.jianshu.com/p/12a2402b29c2 (会有异常信息啥的总结) & http://www.cocoachina.com/articles/8418 (只是符号化的三种方法)

QA小姐姐们给的.crash或者.ips文件(憋纠结这两个文件有什么差,改下后缀名就ok),用文本编辑器打开文件是一堆十六进制的内存地址,你会郁闷的发现压根看不懂:

未符号化的crash
  • Q:十六进制内存地址可以改成看得懂的么?

A:当然,将这些十六进制地址转化成方法名称和行数的过程称之为Symbolication(符号化)。符号化很简单,只要你把你的.crash文件拉到上面提到过的Xcode的device log里面,然后几秒钟后就会符号化。但是这里有个前提,就是这个发生crash的版本包必须是你自己的Xcode里面Archive出来的(这个是苹果自带的方法,会自动检测是否含有匹配的.dSYM文件和应用二进制文件)。

  • Q:那如果要是在新电脑上也想符号化怎么办?

答案是,只有相匹配的.dSYM文件和应用二进制文件就可以符号化。必需完全匹配才行。否则,日志将无法被完全符号化。

那么我们就来看一下如果通过dSYM符号化吧~ 最简单的就是xcode会自动符号化你电脑当前的版本app的crash,如果不是的话我一般是命令行。

把你的crash文件以及拷贝symbolicatecrash(可以电脑全局搜这个文件,在xcdoe目录下)文件到当前目录、XXXX.dSYM放到同一个目录下,然后cd到这个路径,先执行export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer,然后执行:

symbolicatecrash appName.crash appName.app > appName.log 

然后你在看的的就是酱紫的啦:


符号化以后的crash

7. Xcode模拟定位

参考:https://www.jianshu.com/p/490622baba41

这个是我们测试小哥哥问我的,我就找了一下,通过这个可以定位但是如果app是通过手机号or网络判断国家的就没用哈

改的方式超级简单,edit schema即可~


改schema的模拟定位

8. Instruments性能检测

instruments有个工具叫做Time Profiler,他可以把运行的app里面那步占多少时间都展示出来,但是很神奇如果直接run起来看到的就是类似酱紫的:

带有16进制的详情

最左边其实就是这步的耗时,展开可以看里面每小步的耗时,但是很神奇为啥我们看到的函数名都是十六进制的呢,这个其实就和crash log是类似的,如果你想让看起来是正常的需要改一下build setting哈~

解决十六进制

(参考:https://www.jianshu.com/p/ab9c36d0a218)

这里有几个注意点哈:

  • 如果你的项目有Pods,那么Pods里面额build setting也要改成DWARF with dSYM File,反正就是你能找到debug information format的地方就都改了
  • 改完如果还是十六进制,那么重新Profile一下(Command + I or 或者菜单里面查Profile)
  • 如果还不行就重启Instruments

然后就会变成酱紫啦~ 这里由于防止外露就遮掉了部分,但反正打开折叠都是你看得懂的英文字母啦,然后你就可以找到耗时多的进行优化了~~

符号化以后的

关于Time Profiler使用还可以参考:https://my.oschina.net/u/2361492/blog/1539353


9. 筛选编译错误

每次build如果出错从一堆warning里面找error好痛苦,其实只要点一下就可以啦

你可能感兴趣的:([iOS] Xcode调试技巧 & 弱网等)