165 – LLDB实用 – watchpoint

22. 四月 2019 iOS 0

这个watchpoint作为第二个实用拿出来,主要是面试时因为这个而错失一个很好的机会。所以会想着先把这个学习总结一下,后面一篇文章我会再写breakpoint的实用。

1.认识watchpoint

我们还是通过help watchpoint来进一步看看LLDB中对watchpoint的定义.

除了set这个子指令我们需要关注以外,其他指令和breakpoint差不太多,所以我们这篇文章主要看看watchpoint的设置,和主要用途。

我们在设置watchpoint时,可以用到的是两种命令:

因为可以对某一个内存地址打断点,所以我们把watchpoint也称为内存断点。

由于可以观测其读写,所以还可以细分为:
内存写入断点:watchpoint set expression -w write -- my_ptr不添加 -w参数 默认为写入断点,
内存访问断点:watchpoint set expression -w read -- my_ptr

2.watchpoint的使用场景

watchpoint的使用场景很简单,具体就举两个例子:

1.观察属性的值变化:
当变量值被读写时,会有断点并显示出old和new值

2.观察地址的值变化:
当内存地址被读写时,会有断点并显示出old和new值

注意

1.使用watchpoint set vairablewatchpoint set expression监测同一个对象时,会出现Watchpoint creation failed,因为他们watchpoint不论变量还是地址,本质都是对对象的指针地址进行观察

2.观测地址的获取,_aStr的地址?
首先,我们在使用内存断点时,比如我们的本意是检测_aStr这个实例指针对象的读写。但是,我们在使用watchpoint set express -- _aStr时,却是不正确的。
因为,_aStr是一个指针对象,意思就是_aStr是一个NSString *的指针,也就是我们为它开辟的内存空间是需要它存一个NSString *的指针的地址的。
直接使用_aStr就是用它所存储的数据 —> NSString *的指针 —-> *_aStr就是字符串

所以_aStr的内存地址就是一个 NSString **指针。
一个指向NSString *指针的指针!
所以在获取_aStr的内存地址时,应该为p &_aStr

3.总结

watchpoint的使用其实很简单,知道应该怎么用,但是在调试代码的时候又不知道能用到什么地方。
如何才能融会贯通,这才是我应该在今后的项目中学习的地方。