iOS开发之lldb调试命令

首先声明一点,这是把之前混合的博客内容,又进行了单独整理,望大家多多包含......

开发过程中,我们难免需要断点调试,但是断点调试之后,我们想知道一些对象信息或者堆栈信息,应该怎么办?相信断点调试过的开发者都知道,断点执行后,会在输出框内出现(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行。哇,好神奇啊!

 

之前博客内容:

https://blog.csdn.net/hbblzjy/article/details/53018192?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159435128219724843307725%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=159435128219724843307725&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v1~rank_blog_v1-1-53018192.pc_v1_rank_blog_v1&utm_term=lldb

https://blog.csdn.net/hbblzjy/article/details/73543844?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159435128219724843307725%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=159435128219724843307725&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v1~rank_blog_v1-5-73543844.pc_v1_rank_blog_v1&utm_term=lldb

 

 

你可能感兴趣的:(常用知识点,iOS,lldb,命令行,po)