iOS 调试进阶-更高效的使用 Xcode 和 LLDB
Posted iOS大全
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 调试进阶-更高效的使用 Xcode 和 LLDB相关的知识,希望对你有一定的参考价值。
(给ios大全加星标,关注iOS动态)
https://juejin.im/post/5d0349f56fb9a07ecd3d58ad
-
修改简单的逻辑 - expression -
跳过不想执行的语句 - thread jump -
通过 Debug 修改 UI - recursiveDescription
expression 的使用
// Bug: 减操作错误,应该减一
if isAdd {
count = count + 1
} else {
count = count - 2
}
countLabel.text = "(count)"
isAdd 是一个布尔值,我们通过这个布尔值来对count进行相应操作。
正常的需求是:如果isAdd是true我们则对count进行加一操作;
如果isAdd是false我们则对count进行减一的操作。
-
在 LLDB 中输入:每次都要输入 -
在断点中配置:只需输入一次
在 LLDB 中的使用
在断点中的配置
-
在if isAdd {这行代码打一个断 -
右键断点选择 edit Breakpoint
-
点击弹出框的 Action 按钮,在下方的文本框输入expression isAdd = false -
选中 optional 选项
编辑过的断点会在箭头内部添加一个白色三角形,具体可见上方的两个图的区别。这样可以使我们更方便的找到已经编辑过的断点。
thread jump 的使用
修改 UI
//格式:expression -l objc -O -- <expr>
// - 打印self.view 的子视图
expression -l objc -O -- [`self.view` recursiveDescription]
//格式:unsafeBitCast(point, to: type)
//第一个参数为子控件的内存地址,第二个参数为子控件的类型。
// - 将一个UIButton的实例的x赋值为100
expression unsafeBitCast(0x7fa94cb015c0, to: UIButton.self).frame.origin.x = 100
//刷新暂缓区
expression CATransaction.flush()
Note - 设置别名
//设置别名
commend alias 别名 原命令
//这样就可以使用 flush 来代替 expression CATransaction.flush()
command alias flush expression -l objc -- (void)[CATransaction flush]
p po frame
p/po: 无实质性的区别,看你自己需要的格式使用。
frame: 直接从内存中获取,输出 LLDB 的格式。
-
p/po 不能使用的时候,frame应该能使用 -
在Xcode10.2 中,新添加了v/vo来替代p/po,具体详情可参见下方链接
https://juejin.im/post/5ce4a2b3f265da1b897aa507
总结
-
LLDB 表达式可以修改代码的状态 -
通过thread jump --by 1跳过代码 -
使用 Obj-c 的代码在 Swift 的框架中:expression -l objc -O -- <expr> -
刷新视图暂存区:CATransaction.flush() -
设置别名:
command alias poc expression -l objc -O --
command alias flush expression -l objc -- (void)[CATransaction flush]
参考
-
Advanced Debugging with Xcode and LLDB
推荐阅读
(点击标题可跳转阅读)
看完本文有收获?请分享给更多人
关注「 iOS大全 」加星标,关注 iOS 动态
好文章,我在看❤️
以上是关于iOS 调试进阶-更高效的使用 Xcode 和 LLDB的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Xcode 和 Browserstack 调试 iOS 应用程序?
转使用Xcode和Instruments调试解决iOS内存泄露