LLDB是XCode内置的为我们开发者提供的调试工具,它与LLVM编译器一起,存在于主窗口底部的控制台中,能够带给我们更丰富的流程控制和数据检测的调试功能。在调试过程中熟练使用LLDB,可以让你debug事半功倍。
LLDB可以带来以下体验:
- 允许你在程序运行的特定时暂停它
- 查看变量的值
- 执行自定的指令
- 按照你所认为合适的步骤来操作程序的进展
- More
常用基本命令
expr
可以在调试时动态执行指定表达式,并将结果打印出来。常用于在调试过程中修改变量的值。
如图设置断点,然后运行程序。程序中断后输入下面的命令:
bt
打印调用堆栈,加all可打印所有thread的堆栈
打印
打印变量的值可以使用print
命令,print命令的简化方式有prin pri p
,幸运的是p
被lldb
实现为特指print
。
该命令如果打印的是简单类型,则会列出简单类型的类型和值。如果是对象,还会打印出对象指针地址,如下所示:1
2
3
4
5
6
7
8
9
10
11
12
(lldb) print a
(NSInteger) $0 = 0
(lldb) print b
(NSInteger) $1 = 0
(lldb) print str
(NSString *) $2 = 0x0000000100001048 @"abc"
(lldb) print url
(NSURL *) $3 = 0x0000000100206cc0 @"abc"
在输出结果中我们还能看到类似于$0
,$1
这样的符号,我们可以将其看作是指向对象的一个引用,我们在控制面板中可以直接使用这个符号来操作对应的对象,这些东西存在于LLDB的全名空间中,目的是为了辅助调试。如下所示:1
2
3
4(lldb) exp $0 = 100
(NSInteger) $9 = 100
(lldb) p a
(NSInteger) $10 = 100
另外$后面的数值是递增的,每打印一个与对象相关的命令,这个值都会加1。
上面的print命令会打印出对象的很多信息,如果我们只想查看对象的值的信息,则可以使用po(print object的缩写)命令,如下所示:1
2(lldb) po str
abc
当然,po命令是”exp -O —“命令的别名,使用”exp -O —”能达到同样的效果。
对于简单类型,我们还可以为其指定不同的打印格式,其命令格式是print/,如下所示:1
2(lldb) p/x a
(NSInteger) $13 = 0x0000000000000064
格式的完整清单可以参考Output Formats。
expression
在开发中,我们经常会遇到这样一种情况:我们设置一个视图的背景颜色,运行后发现颜色不好看。嗯,好吧,在代码里面修改一下,再编译运行一下,嗯,还是不好看,然后再修改吧~~这样无形中浪费了我们大把的时间。在这种情况下,expression命令强大的功能就能体现出来了,它不仅会改变调试器中的值,还改变了程序中的实际值。我们先来看看实际效果,如下所示:1
2
3
4
5(lldb) exp a = 10
(NSInteger) $0 = 10
(lldb) exp b = 100
(NSInteger) $1 = 100
2015-01-25 14:00:41.313 test[18064:71466] a + b = 110, abc
expression命令的功能不仅于此,正如上面的po命令,其实际也是”expression -O —“命令的别名。更详细使用可以参考Evaluating Expressions。