随着Xcode 5的发布,LLDB调试器已经取代了GDB,成为了Xcode工程中默认的调试器。它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能。LLDB为Xcode提供了底层调试环境,其中包括内嵌在Xcode IDE中的位于调试区域的控制面板,在这里我们可以直接调用LLDB命令.平时用Xcode运行程序,实际走的都是LLDB。熟练使用LLDB,可以让你debug事半功倍。
我们以一个实际例子进行学习使用,为了方便,我们先写一个Person类:
class Person: NSObject {
var name:String
var age:UInt32
init(name:String,age:UInt32) {
self.name = name
self.age = age
}
//重写description是为了方便调试
override var description: String{
return "name:\(name),age:\(age)"
}
}
进入 ViewController.swift添加一个测试函数,添加相应断点,并在viewDidLoad()中调用,执行代码到函数的最后,如下图:
首先看一下打印命令p/po
在控制台使用p和po来替代print,对于p和po,第一次看到可能不明白是啥,我们可以输入help,在帮助信息中我们可以找到p和po部分如下:
(lldb) help
p -- ('expression --') Evaluate an expression (ObjC++ or Swift)in
the current program context, using user defined variables and
variables currentlyin scope.
po -- ('expression -O -- ') Evaluate an expression (ObjC++ or Swift)
in the current program context, using user defined variables and
variables currentlyin scope.
所以,p命令,本质是expression --;po命令,本质是expression -O —,其中-O的表示:-O ( --object-description ) Display using a language-specific description API, if possible.
注意打印输出的最底部信息:For more information on any command, type'help <command-name>'.我们通过输入help和命令名得到更详细的帮助。
1:p命令会打印出对象的类型和相关属性.
(lldb) p person
(LLDBDemo.Person) $R0 = 0x00007f93fb4f4ae0 {
ObjectiveC.NSObject = {}
name = "Jack"
age = 24
}
2:po命令对于继承自NSObject得对象,指示会打印出description中的内容,类似于print函数.
(lldb) po person
name:Jack,age:24
3:在看一个数组的小例子,直接console中输入:
(lldb) po ["123","456"]
▿ 2 elements
- [0] : "123"
- [1] : "456"
(lldb) p ["123","456"]
([String]) $R3 = 2 values {
[0] = "123"
[1] = "456"
}
4:打印视图的层级结构,该功能还是挺有用的
(lldb) po view.performSelector("recursiveDescription")
▿ Unmanaged<AnyObject>
- _value : <UIView: 0x7f93fb4dc930; frame = (0 0; 414 736); autoresize = W+H; layer = <CALayer: 0x7f93fb411150>>
| <UIButton: 0x7f93fb4f62e0; frame = (115 163; 46 30); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x7f93fb4da5a0>>
| <_UILayoutGuide: 0x7f93fb489720; frame = (0 0; 0 0); hidden = YES; layer = <CALayer: 0x7f93fb411170>>
| <_UILayoutGuide: 0x7f93fb4ef7a0; frame = (0 0; 0 0); hidden = YES; layer = <CALayer: 0x7f93fb404f00>>
这里还有一个好玩的东西,那就是每个视图中,都有一个16进制的字符串,代表这个视图的ID,比如这个:UIView:0x7f93fb4dc930;这个 ID的作用非常的强大,得到了这个ID,我们就可以通过这个命令来得到这个视图的引用了:
(lldb) expression let $view = unsafeBitCast(0x7f93fb4dc930, UIView.self)
然后就可以对该视图进行操作了,例如执行如下代码:
(lldb) expression $view.backgroundColor = UIColor.redColor()
程序运行完成,整个视图背景颜色变红。ID还是很有用的,当然我们也可以直接操作当前视图,如下:
既然可以动态改变视图背景,那么我们也可以动态添加相应的视图,接下来我们添加一个layer到当前视图上:
(lldb) expression