- 在日常开发中我们经常会用到
LLDB调试
,比如:p xxx,po xxx,bt等等,这些调试命令的作用都是什么呢?源码探索
对于开发来说也是一件必须要掌握的事情,源码探索的方法又有哪些呢?
下面针对这两点,我们将一一进行解释说明!
LLDB常用调试命令集合
1. p和po命令
- p 命令: print 命令的简写,使用p 命令可以查看基本数据类型的值;如果使用p命令查看的是对象,那么只会返回对象的指针地址。 p命令后面除了可以接变量、常量,还可以接表达式。
- po 命令:print object的缩写,可以理解为打印对象。功能与p命令类似,也可以打印常量、变量,打印表达式返回的对象等。
p 和 po 的区别在于使用 po 只会输出对应的值,而 p 则会返回值的类型以及命令结果的引用名。
ps: 使用p做进制转换
1 | //默认打印为10进制 |
2. bt命令(thread backtrace堆栈打印简写)
- bt命令可以打印出线程的堆栈信息,bt命令是打印当前线程的堆栈信息,如下图所示。该信息比左侧的Debug Navigator 看到的还要详细一些。如果嫌堆栈打印太长,可以加一个值限制,如bt 10。
- bt all 命令可以打印所有线程的堆栈信息。
3. 内存读取命令
- x命令就是memory read内存读取并打印的作用, x是读取内存的命令
- x/4gx中第一个x是读取内存命令,后面的g是每次读取8字节,x的意思是16进制显示结果,4表示连续打印4段。
- 对于g,常用的大小格式为b对应byte 1字节,h对应half word 2字节,w对应word 4字节,g对应giant word 8字节
- 对于x,我们还可以用o对应8机制,b对应2进制,x对应16进制,f对应浮点,d对应10进制。
4. thread list命令
- 用于列出所有线程,如下图所示,其中星号(*)表示thread#1为当前线程。
5. 待续。。。
源码探索的的三种方法
- 打
符号断点
方式调试流程 - 通过按住
control
+step into
按钮逐步进入调试 - 汇编源码跟流程
1. 打符号断点
方式调试流程
选择编译器调试中的Symbolic Breakpoint
断点调试
例如:探索alloc方法,添加Symbolic Breakpoint
断点,即可查看到alloc源码位于libobjc.A.dylib库中,如下图:
2. 通过按住control
+step into
按钮逐步进入调试
在相应的alloc处打上断点,当执行到断点处时,按下control
+step into
即可逐步调试
调试结果依然可以看到alloc源码位于libobjc.A.dylib库中
3. 汇编源码跟流程
xcode 工具栏 选择 Debug –> Debug Workflow –> Always Show Disassembly,这个 选项表示 始终显示反汇编 ,即 通过汇编 跟流程
调试结果同方法2,依然可以看到objc_alloc
,从而得到alloc源码位于libobjc.A.dylib库中
ps:注意(以下是Apple 提供的源码下载地址):
1、Apple 所有开源源码汇总地址,根据相应的版本查找对应的源码,以mac 10.15为例: macOS --> 10.15 --> 选择10.15 --> 搜索 objc
2、Apple 比较直接的源码下载地址,直接搜索想要下载的源码名称即可,例如objc:直接搜索objc --> objc4/ --> 选择相应的objc的版本