# LLDB调试一些常用命令和技巧
LLDB调试一些常用命令和技巧
1.常用命令
help是帮助命令,会打印出一个command list,help + <command名称>可以查看某一个命令的描述
LLDB有前缀识别,如next输入n就行了,print输入p,expression输入e就可以.生成的$4是暂存在lldb的变量名.
p打印变量
po打印变量的description
p/x 1000打印1000的16进制(十进制d,二进制t同理)
e int $a =2定义变量
e $a = 3修改变量(也可以修改断点时的代码中的变量)
image流程控制
c(continue) 取消断点的暂停 一直到下一个断点,对应第一个按钮
n(next) 向下执行一行代码,如果是函数则黑盒执行,不会进入函数
s(step) 进入函数内部,如果下一行不是函数,那么n和s是一样的
finish 跳出函数
thread return (+返回值) 可以主动给函数返回值并立即跳出函数,返回值会在程序中起效 (例thread return NO thread return 110)
imageframe info 打印当前的代码函数,文件等等信息
一个例子
//打印出keyWindow的信息
(lldb) po [[[UIApplication sharedApplication] keyWindow] recursiveDescription]
<UIWindow: 0x7f82b1fa8140; frame = (0 0; 320 568); gestureRecognizers = <NSArray: 0x7f82b1fa92d0>; layer = <UIWindowLayer: 0x7f82b1fa8400>>
| <UIView: 0x7f82b1d01fd0; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x7f82b1e2e0a0>>
//把window的view保存在lldb中
(lldb) eid$myView = (id)0x7f82b1d01fd0
//修改背景颜色
(lldb) e (void)[$myView setBackgroundColor:[UIColorblueColor]]
//但是只有程序继续运行之后才会看到界面的变化。因为改变的内容必须被发送到渲染服务中,然后显示才会被更新。渲染服务实际上是一个另外的进程 (被称作backboardd)这时执行[CATransaction flush]方法开启渲染
(lldb) e (void)[CATransaction flush]
//获取导航控制器
(lldb) eid$nvc = [[[UIApplicationsharedApplication] keyWindow] rootViewController]
//可以创建一个新的vc
(lldb) e id$vc = [UIViewController new]
//push出来
(lldb) e (void)[vc animated:YES]
//渲染
(lldb) e (void)[CATransaction flush]