控制台调试干嘛用
除了用Xcode控制断点\打印变量之外,控制台调试最大的作用就是可以注入代码
基本操作
在断点暂停的状态下,控制台内可以输入
- n (next下一步)
- s (step进入函数)
- c (continue继续执行)
- p (print打印某个指针)
- po (print object打印某个指针指向的内容)
例如
po self.view
注入代码控制变量值
控制台调试最重要的就是注入代码
- e (expression执行函数)
例如
BOOL value = YES; //break point
if (value) {
NSLog(@"%tu",value);
}
比如在上述代码中,value如果正常运行,始终为YES,我们可以通过注入代码让其改变
(lldb) po value
YES
(lldb) e value = NO
(BOOL) $4 = NO
(lldb) po value
NO
可以动态改变某个值,从而帮助调试
注入代码控制UI
我们还可以通过注入代码指向某个内存,或者变量,执行一些函数,如先改变背景色,然后通过**[CATransaction flush]**刷新就可以看到效果.
记住声明变量的时候带”$”号,以及执行函数时的返回值(void)等
(lldb) e id $myView = self.view
(lldb) po $myView
<UIView: 0x7faecae7dfe0; frame = (0 267; 375 400); autoresize = W+H; layer = <CALayer: 0x7faec95bf200>>
(lldb) po self.view
<UIView: 0x7faecae7dfe0; frame = (0 267; 375 400); autoresize = W+H; layer = <CALayer: 0x7faec95bf200>>
(lldb) e id $youView = (id)0x7faecae7dfe0
(lldb) po $youView
<UIView: 0x7faecae7dfe0; frame = (0 267; 375 400); autoresize = W+H; layer = <CALayer: 0x7faec95bf200>>
(lldb) e (void)[$myView setBackgroundColor:[UIColor blueColor]]
(lldb) e (void)[CATransaction flush]
控制当前函数返回值
控制台还可以通过指令控制返回值,即使进入了汇编的界面也可以,比如有一些.a静态库的函数,Step进入函数后,直接是汇编界面,此时可以直接控制返回
(lldb) thread return NO
更多的可以查看参考文献