工欲善其事必先利其器
写代码不可能一蹴而就,总是需要我们反复调试。而Xcode给我提供了非常强大的测试手段,关键在于是否自己能熟练运用到自己平常中。相信好的手段和方式是成功的一半。不说了,直接干货。。
以下皆是在断点状态下的调试输入($0 代表p打印的变量标识,lldb会默认给出顺序$0、$1、$2....)
1.查看控制器层次
po [[[UIWindow keyWindow] rootViewController] _printHierarchy]
2.查看视图层级
po [[UIWindow keyWindow] recursiveDescription]
3.打印当前线程状态
bt
4.打印全部线程状态
bt all
5.打印值
print
或p (会带有变量标示符$)
print $0 + 7 (带美元符号的都可当做参数使用)
6.指定格式打印
p/x $0
x代表格式,x-16进制 ,t-2进制,c-字符,s-字符串
7.改变值
expression x = xx (expression 可以简写为e)
8.声明变量
e int $a = 2 (声明变量,不过变量前必须加美元符号)
9.断点控制
process continue (简写 c 继续执行) thread step-over ( n 单步执行(是不是函数都是下一步,不会跳进去)) thread step-in (s 单步执行(是函数则跳进去,否则下一步)) finish ( 执行到下一个返回语句 (直到一个堆栈帧结束) 然后再次停止)
10.会告诉你当前的行数和源码文件
frame info
11.thread return x (它有一个可选参数(X),在执行时它会把可选参数加载进返回寄存器里,然后立刻执行返回命令,跳出当前栈帧。这意味这函数剩余的部分**不会被执行**。这会给 ARC 的引用计数造成一些问题,或者会使函数内的清理部分失效。但是在函数的开头执行这个命令,是个非常好的隔离这个函数,伪造返回值的方式 。)
12.查看所有断点
breakpoint list(或者 br li)
13.管理断点:
br dis 1 (指定不可用) br del 1 (删除某一断点)
breakpoint set -f ViewController.m -l 21 (指定文件的指定行数创建断点) breakpoint set -F "-[ViewController getNum]” (指定方法创建断点) 简写: b ViewController.m:24
14.查看内存
x/c $0
15.查看响应事件的所有目标
po [$0 allTargets]
16.查看目标的响应方法
po [$0 actionsForTarget:(id)0x7f80faf20b80 forControlEvent:0] (0x7f80faf20b80 为p打印出的内存地址)
参考:
objc.io
此外可以使用facebook发布的Chisel(这是一个python脚本,封装了很多编辑调试命令,可以事半功倍,不幸的是看到文章说Xcode7.2完美运行,Xcode7.3有很多命令不能使用了,作者正在更新...)
看~灰机灰过去了~灰机又灰过来了
网友评论