断点
1. 普通断点
在行号那儿点一下就加上了,最常用的断点,略。
2. 条件断点
很多时候问题代码是被高频调用直到特定条件下才出现问题的,这种时候可以使用条件断点。
在任意断点右击选择Edit Breakpoint即可编辑条件。
3. 符号断点
有时候我们没有源码只有头文件,不方便加普通断点,可以使用符号断点。在断点界面点击 + ,选择Ad Symbolic Breakpoint,即可添加符号断点。
4. 异常断点
抛出Objc异常时的断点,由于Objc能捕获异常的场景非常少,因此用处比较有限。
LLDB常用命令
-
p/po(print/print object)
- 打印一个值/对象
-
call
- 调用一个方法并输出返回值
-
expr
- 执行一个表达式,常用于运行时改变数据,构造特定场景
-
bt
- 打印当前堆栈信息
更多参考iOS——调试工具LLDB学习
僵尸对象
用于对野指针问题的分析。
野指针问题导致的crash堆栈往往千奇百怪,其根本原因是对象被释放后,对应的内存是不确定什么时候会被覆盖多少的,造成后面访问时可能正常也可能crash。
僵尸对象就是消除这种不确定性的方法,在对象被释放时,会生成一个僵尸类,把对应内存中的isa替换掉,指向这个僵尸类。这样在通过野指针访问这个对象时就可以100%捕获了。
此功能可以在“Edit Scheme…” —> “Run” —> “Diagnostics” —> “Zombie Objects”中打开,应当只在debug时使用,对性能影响比较大。
Address Sanitizer
Address Sanitizer是个更底层一点的手段,僵尸对象只对Objc对象的野指针有效,而Address Sanitizer可以检查任意内存访问错误的问题。典型场景如C的数组越界。
Time Profile
Time Profile用于检测CPU使用耗时,方便优化性能问题。
如果某个操作存在性能问题,可以在操作前,开启Time Profile Record,操作后Stop。Time Profile会记下期间所有方法的CPU耗时,并从高到低排列。于是就可以方便地找到耗性能的瓶颈进行针对性地优化。
Allocations
Allocations工具用于分析内存问题。
在应用启动后,特定操作前后进行打点,即可看到期间所有的内存增长来源。
对于可复现的内存问题非常方便定位。
© 著作权归作者所有
发表评论