原创Blog,转载请注明出处
http://blog.csdn.net/hello_hwc?viewmode=list
我的stackoverflow
前言:LLDB是个开源的调试器,与XCode绑定的
LLDB的使用中,Swift与Objective C还是有一些差别的
本文主要侧重LLDB的常用命令
资料(目前状态XCode 7.2 Swift 2.1.1),非XCode 7.2+本文代码可能不能运行
- objc.io(强烈建议有Objective C经验,但是对LLDB不熟悉的深入研究下)
- Apple官方文档
- LLDB的文档
- 一个封装LLDB的库,可以辅助调试
- 2015 WWDC视频
对了,Swift到现在也不过一岁半,所以LLDB对于Swift的支持肯定不如OC那么好。
如何打开LLDB如何使用?
通常的方式就是断点,另外,关于利用XCode图形化调试,在我这篇文章里有详细讲解
本文适合XCode 7.2 +
不管是在程序中加断点
还是手动的暂停程序
让代码停在Swift Error 或者Objective C异常
停在Objective C异常
(lldb) br s -E objc
Breakpoint 6: where = libobjc.A.dylib`objc_exception_throw, address = 0x000000010dededbb
停在Swift Error
(lldb) br s -E swift
Breakpoint 7: where = libswiftCore.dylib`swift_willThrow, address = 0x000000010e55ccc0
停在某一种类型的Swift Error
(lldb) br s -E swift -O EnumError
Breakpoint 8: where = libswiftCore.dylib`swift_willThrow, address = 0x000000010e55ccc0
以此作为开端,希望读者能耐心看完,本文很长
准备工作
为了方便,我们先写好这样的一个Model类,定义个ErrorType,并且定义个实例方法抛出异常
enum CustomError:ErrorType{
case LeoError1
case LeoError2
}
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)"
}
func PersonException() throws{
throw CustomError.LeoError1
}
}
然后在viewDidLoad中初始化一个对象,并打一个断点
let person = Person(name: "Leo", age: 23)
打印命令 p/po
p
(lldb) p person
(SwiftLLDBDemo.Person) $R0 = 0x00007f99b8d30b40 {
ObjectiveC.NSObject = {
isa = SwiftLLDBDemo.Person
}
name = "Leo"
age = 23
}
po
(lldb) po person
name:Leo age:23
p命令会打印出对象的类型,如果是Objective C对象,会打印出isa,以及属性的值
po 命令 对于继承自NSObject得对象,指示会打印出description中的内容
再举个例子
(lldb) po ["123","345"]
▿ 2 elements
- [0] : "123"
- [1] : "345"
(lldb) p ["123","345"]
([String]) $R2 = 2 values {
[0] = "123"
[1] = "345"
}
也可以,调用一段代码
(lldb) p for i in 1...3{ print(i) }
1
2
3