1、在 LLDB 中修改 App 状态
在 LLDB 中通过expression命令可以改变程序当前的各种状态,e、expr 作为简写也可以实现同样的功能。我们用一个简单的UILabel来举例,为myLabel设置一个值 hello , 正常来讲视图上的myLabel就应该显示 hello 。
func test() -> Void {
myLabel.text = "hello"
// 断点 ->
}
你可以在myLabel.text = "hello"这句代码后设置一个断点,运行程序执行断点后,在控制台的 LLDB 调试器 中输入下面的表达式改变它的值,在继续运行程序之后,相信你在界面上看到的值一定是 hello world 。也可以改变颜色,执行方法,调整控件frame等。
// 改变 myLabel 文案
e myLabel.text = "hello world"
// 改变 myLabel 文字颜色
e myLabel.textColor = UIColor.red
// 执行 test 方法
e test()
// 调整控件frame和约束
e myLabel.frame = CGRect(x: 100, y: 200, width: 100, height: 100)
e myLabel.y = 20
e self.topConstraint.updateOffset(20)
2、利用断点实时插入代码
编辑断点-action选择debugger command,可以输入你想注入的lldb命令,最后选择自动继续执行后续代码,而不会停在这一行。即可实现注入lldb代码。
3、监听属性变化
1、符号断点
在 Symbol 一栏输入任何你想监听的函数比如[UILabel setText:],之后所有页面下的所有UILabel类型对象在设置text属性的时候都会执行该断点。在这个断点的控制台中,并没有显示变量属性等信息,我们怎么能知道设置了什么呢?接下来我们可以用$arg1
、$arg2
等命令来打印出我们想要的信息。在这里$arg1
是指对象本身,$arg2
是对象被调用的函数,po命令无法直接输出函数名,需要加上(SEL),$arg3
是被赋给text的值。
2、watch
在控制台找到要监听的属性,右键-watch即可。重新编译需要重新设置。
4、查看约束调用栈
Edit Scheme... -> Run -> Diagnostics -> Memory Management -> 勾选 Malloc Stack 并且切换至 All Allocation and Free History。重新打开Debug View Hierarchy,启动 Show Constraints。在右侧的show object inspector即可查看Backtrace
5、修改约束
通过po self.view.constraints或者Debug View Hierarchy中选中约束,即可拿到约束的地址,然后通过unsafeBitCast方法把地址转化为约束对象,即可实现在lldb里面设置约束
e unsafeBitCast(0x2803db480, to: NSLayoutConstraint.self).constant = 20
参考
WWDC 2018:效率提升爆表的 Xcode 和 LLDB 调试技巧
WWDC18 -Advanced Debugging with Xcode and LLDB
网友评论