首先声明一点,这是把之前混合的博客内容,又进行了单独整理,望大家多多包含......
开发过程中,我们难免需要断点调试,但是断点调试之后,我们想知道一些对象信息或者堆栈信息,应该怎么办?相信断点调试过的开发者都知道,断点执行后,会在输出框内出现(lldb)这样的字眼,此时,我们就需要相关的调试命令,然后输出我们想要的内容了,现在就开始简单的介绍一下吧!
1、po命令
print object的缩写,表示显示对象的文本描述,如果对象不存在,则打印为nil;
比如:你想知道一个视图包含了哪些子视图,你可以通过for循环的方式打印出来子视图,但是下面的只需一个命令就可解决,输出视图层级关系(这是一个被隐藏的命令):
po [[self view] recursiveDescription]
再比如:你想打印一个model,直接用NSLog或po对象,结果是model的地址,这并不是我们想要的,那么如何解决呢?
你可以重写model里面的description方法,但是,如果model的属性非常多,这就不适用了。因为你不可能说在description方法里拼接属性返回,这样不仅麻烦,而且可读性非常差。所以,我们可以利用runtime动态获取属性并返回。推荐你重写debugDescription方法,因为两个方法效果一样,区别在于debug方法是在你使用po命令时调用的,实际上也是调用了description方法。
2、p命令
可以用来打印基本数据类型
3、call命令
执行一段代码,比如:
call NSLog(@"%@",@"yang")
4、expr命令
动态执行指定表达式,比如:
expr i = 101
输出:(int)$0 = 101
5、bt命令
打印当前线程堆栈信息,比如:
//打印所有线程堆栈信息
bt all
6、image命令
常用来寻找栈地址对应代码位置,
比如:数组越界
//模拟代码
NSArray *arr = @[@"0",@"1",@"2"];
NSLog(@"%@",arr[3]);
//此时,会输出错误信息
*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 3 beyond bounds [0 .. 2]'
*** First throw call stack:
(
0 CoreFoundation 0x000000010579734b __exceptionPreprocess + 171
1 libobjc.A.dylib 0x00000001051f821e objc_exception_throw + 48
2 CoreFoundation 0x00000001056d1eeb -[__NSArrayI objectAtIndex:] + 155
3 BGMultimediaDemo 0x0000000104c25550 -[ViewController viewDidLoad] + 192
4 UIKit 0x0000000105d5c06d -[UIViewController loadViewIfRequired] + 1258
......
......
......
21 BGMultimediaDemo 0x0000000104c25adf main + 111
22 libdyld.dylib 0x000000010857268d start + 1
23 ??? 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
这个时候我们如果怀疑出错的地址是0x0000000104c25550,那么我们可以使用下面命令找出错误代码的位置:
image lookup --address 0x0000000104c25550
//执行命令后,输出结果:
Address: BGMultimediaDemo[0x0000000100001550] (BGMultimediaDemo.__TEXT.__text + 192)
Summary: BGMultimediaDemo`-[ViewController viewDidLoad] + 192 at ViewController.m:30
从上面的结果可以看出,错误位置在ViewController.m中的第30行。哇,好神奇啊!
之前博客内容: