LLDB
是个开源的内置于XCode
的具有REPL(read-eval-print-loop)
特征的Debugger
,其可以安装C++
或者Python
插件。
程序运行到断点位置,输出控制台会显示:(lldb)
lldb
与gdb
命令名的对照表:http://lldb.llvm.org/lldb-gdb.html
lldb
模式支持很多命令,你可以在输出控制台的光标处输入 help
一下,也可以 help XXX
(子命令集合)
打印:
print
或者printobject
我们常用的po
就是printobject
,po param
输出0x403e000000000000
还有print
,也可以简写为p param
输出(NSMutableDictionary *) $0 = 0x403e000000000000
寄存器读取:
register read
当进入断点时,堆栈中高亮部分,可以通过点击看到代码,而非高亮区域,可以通过点击查看汇编代码。
看到代码的部分,使用register read
打印出当前的寄存器中的地址,再对应po
出对应的地址,如po $x0
。
汇编代码的部分,可以直接po
出对应的地址。查看当前断点线程:
thread info
亦可以在命令后加上数字查看线程号,例如thread info 1
查看线程的调用栈
thread backtrace
没啥大用,右侧调试堆栈能直接看到调用方法:
call
call
调用方法的意思,和p
,po
也有此功能,call
可以使用在没有返回值,不需要显示输出的情况下,如设置view
颜色,这样就不用每次为了看效果就跑一次。表达式:
expression
expression
常用于调试时修改变量的值,当进入一个页面,需要基于某个固定的值来调试的时候,可以断点后直接使用expression
命令来赋值,然后继续运行,就省去了硬编码再运行一次的时间。
亦或者修改当前页面的某些属性样式等,只要是和上下文有关的代码场景即可,切记不要加;
号。
感觉,和call
有点像。寻址:
image
当出现异常时,通常能够在控制台看到异常堆栈,我们可以使用image lookup --address 0x0
来寻址异常地址,执行该命令后,就可以精确定位到对应的出错方法和行数。(好像不如用异常断点来的方便)打印调用堆栈:
bt
在断点处,使用命令bt
可以打印出主线程的调用堆栈。使用bt all
则可以打印当前所有线程的调用堆栈。
PS:
很多时候,lldb
完整的命令是很长的。比如前面所说的image lookup --address
这个组合命令。为了方便日常的使用,提高效率,可以简写为im loo -a
,expression
简写为expr
,print
简写为p
等等,lldb
使用的是最短匹配原则,只要不是有与之简写后相同的命令即可。