iOS调试技巧(2)——堆栈
本来想和断点合为一篇,想想还是算了,根据和SRP和OCP,这两者看起来确实有着千丝万缕的联系,但为了未来的扩展,拆分还是必要的。
断点生效之后,按Command+5,可以快速跳到堆栈的导航视图,如下图:
- Thread 1是主线程,也就是常说的UI线程,能够看到的是一个runloop开始到断点之间的堆栈调用的函数符号,按照调用顺序排列,最底部是从main函数向UIApplication发出的runloop开始的调用,一般来说基本没什么参考意义
- 不同的库和framework的堆栈用不同的颜色来表示,蓝色的人头表示的是非系统库的堆栈,紫色的杯子就是UIKit的东西啦
- 看得见函数名称的,说明拥有符号表,没有呢就靠猜吧,当然控制台lldb也是可以打印的
主线程被卡住是非常常见的场景,具体表现就是程序不响应任何的UI交互。这时按下调试的暂停按钮,查看堆栈,就可以看到是到底是死锁、死循环还是死等,导致UI线程被卡住。
下面这张图,做过浏览器都不陌生。主要是Thread 4 WebThread抛出的和UI线程进行同步的堆栈现场。Thread 4 WebThread堆栈顶部有着很明显的wait痕迹。这就是所谓的iOS上面webkit的多线程模型——wait until done。