LLDB是个开源的内置于XCode的具备REPL(read-eval-print-loop)特征的Debugger,其能够安装C++或者Python插件。html
本系列针对于已经知道何为debugger,且有gdb或者lldb使用经验的读者。对于lldb的娴熟使用者,也能够用来做为查阅手册。python
这一篇,咱们讲述lldb内建的命令。objective-c
lldb与gdb命令名的对照表:http://lldb.llvm.org/lldb-gdb.htmlexpress
单单执行help命令会列出全部命令列表,用户加载的插件通常来讲列在最后。xcode
执行help 能够打印指定command的帮助信息,至于插件提供的命令,其帮助信息取决于插件自己的实现。编辑器
例如 help print会打印内建命令print的使用帮助。函数
print命令的简化方式有prin pri p,惟独pr不能用来做为检查,由于会和process混淆,幸运的是p被lldb实现为特指print。工具
实际上你会发现,lldb对于命令的简称,是头部匹配方式,只要不混淆,你能够随意简称某个命令。oop
例如:spa
值得说明的是,返回的$0是命令结果的引用名,使用$0能够进行print $0 + 7这样打印出106,固然,$0能够被用于任何其余表达式或者接收参数的命令。
expression命令能够用来修改变量的值,固然大部分状况下,使用xcode提供的可视化编辑器更方便。
1 2 3 4 |
|
实际上print至关于expression --,而--的意思是命令的参数终止,跟在--后面的都是命令的输入数据。
要打印一个对象,则须要使用e -O -- anObj,而e -O -- 的缩写正是咱们经常使用的po命令:
1 2 3 4 5 |
|
要按特定格式来打印一个变量则使用p/
命令:
1 2 3 4 5 6 7 8 |
|
或者使用p/c打印字符,p/s打印c字符串,详细格式查阅这里。
既然咱们已经知道print其实是expression --的简写,那么在p(或者po)后面跟上复杂的表达式则能够先计算表达式再打印最后的计算结果。
1 2 3 4 5 6 7 8 9 10 11 |
|
值得注意的是,一旦出现了上述错误提示,说明lldb没法断定某一步的计算结果是什么数据类型,这时须要强制类型转换来告诉lldb:
1 2 3 4 |
|
实际上使用xcode自带的可视化工具来控制“继续”“暂停”“下一步”“进入”“跳出”更简单,但这里仍是列出其所对应的命令名:
继续:process continue, continue, c
下一步:thread step-over, next, n
进入:thread step-in, step, s
跳出:thread step-out, finish, f
执行thread return命令可使得当前函数当即返回,也就是说,后续代码都不会执行了。固然执行此命令可能会使得arc的计数追踪出现错乱。
thread return命令须要一个参数来指明函数强制返回时的返回值。
通常来讲,在xcode中新建/删除“行断点”是很容易的,可是断点还有不少进阶使用方法:
条件断点、条件执行、记录日志、自动继续、重复断点跳过。
使用xcode提供的可视化工具来操做是很容易的:
1 2 3 4 5 6 7 |
|
因此,在debugger中能够修改view的颜色、尺寸、甚至建立controller来push。
watchpoint能够在某个变量被写入/读取时暂停程序运行:
1 2 3 4 5 6 7 8 9 10 11 |
|
实际上可使用watchpoint来监视任意一段内存的读写。
使用XCode也能够方便地建立watchpoint。
XCode的可视化debug工具中的watch是一个write类型watchpoint(也就是默认的)
另外,上述语句中 v是variable的简写,一样的,set能够简写为s,watch能够简写为wa,而-w后面的参数是不能够简写的必须为read、write或者read_write。
当前在arm和x86上,咱们一次最多建立4个watchpoint,继续建立会提示错误。
用xcode的可视化工具建立符号断点很简单,在Add symbolic breakpoint中填入符号名便可,这里给出objective-c的函数符号断点的写法:
1 2 |
|
使用XCode的可视化工具来查看memory,要注意watch memory of "p" 和watch memory of "*p"的区别。
手动执行命令能够help x或者 help memory。
lldb的用法很灵活多样,可是XCode的可视化调试工具覆盖面有限,一些高级用法仍需手动输入命令,甚至结合python脚本。