LLDB之基本命令使用(Swift)

       随着Xcode 5的发布,LLDB调试器已经取代了GDB,成为了Xcode工程中默认的调试器。它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能。LLDBXcode提供了底层调试环境,其中包括内嵌在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


在控制台使用ppo来替代print,对于ppo,第一次看到可能不明白是啥,我们可以输入help,在帮助信息中我们可以找到ppo部分如下:


(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和命令名得到更详细的帮助。


1p命令会打印出对象的类型和相关属性.


(lldb) p person

(LLDBDemo.Person) $R0 = 0x00007f93fb4f4ae0 {

  ObjectiveC.NSObject = {}

  name = "Jack"

  age = 24

}


2po命令对于继承自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还是很有用的,当然我们也可以直接操作当前视图,如下:


(lldb) expression self.view.backgroundColor = UIColor.redColor()

既然可以动态改变视图背景,那么我们也可以动态添加相应的视图,接下来我们添加一个layer到当前视图上:


(lldb) expression

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值