Swift:LLDB调试
1、expression
修改简单的逻辑
当我们需要调测一小块变量,并且需要修改部分参数为指定值,一般的操作都是在代码中手动修改。那么如何在不用重新运行项目的情况下修改,这就需要使用 expresion 了
1.1 expresion有两种使用方式
- 在LLDB中输入:每次都要输入
expression 参数 = 指定值
po 参数
- 在断点中配置:只需要输入一次
1)右键选中 Edit Breakpoint
2)点击 anction
3)在下图标识的1中输入需要制定的参数的指,例如:count = 4,并勾选上图中2的选项
注:编辑过的断点会在箭头内部添加一个白色三角形
2、thread jump
跳过不想执行的语句
当我们想跳过一行代码时,可以使用thread jump,但是使用时,xcode会弹出一个警告框,告知我们这种做法很危险,所以,需要谨慎使用!要确保不会出现问题时再使用
*使用
// 跳过1行,可以修改成任意想要的数字
thread jump --by 1
3、recurisiveDescription
通过Debug修改UI
在日常开发中,会经常微调一些UI界面的样式等,每次修改都需要再重新编译运行是非常耗时的,所以可以通过LLDB来实现并改善不运行即可看见效果
例如,如果想修改self.view中某个子控件的位置
- 使用命令打印出self.view的所有子控件的详细信息
//格式:expression -l objc -O -- <expr>
// - 打印self.view 的子视图
expression -l objc -O -- [`self.view` recursiveDescription]
- 拿到需要修改控件的内存地址后,用命令修改子控件的frame
//格式: unsafeBitCast(point, to: type)
//第一个参数为子控件的内存地址,第二个参数为子控件的类型。
// - 将一个UIButton的实例的x赋值为100
expression unsafeBitCast(0x7fa94cb015c0, to: UIButton.self).frame.origin.x = 100
- 修改内存地址后,通过命令刷新暂存区,看见实际的效果
//刷新暂缓区
expression CATransaction.flush()
4 设置命令别名
每次输入的命令比较长,可以设置别名来使用
//设置别名
commend alias 别名 原命令
//这样就可以使用 flush 来代替 expression CATransaction.flush()
command alias flush expression -l objc -- (void)[CATransaction flush]