0%

iOS-底层原理01:LLDB调试命令&源码探索方式

  1. 在日常开发中我们经常会用到LLDB调试,比如:p xxx,po xxx,bt等等,这些调试命令的作用都是什么呢?
  2. 源码探索对于开发来说也是一件必须要掌握的事情,源码探索的方法又有哪些呢?

下面针对这两点,我们将一一进行解释说明!

LLDB常用调试命令集合

1. p和po命令

  • p 命令: print 命令的简写,使用p 命令可以查看基本数据类型的值;如果使用p命令查看的是对象,那么只会返回对象的指针地址。 p命令后面除了可以接变量、常量,还可以接表达式。
  • po 命令:print object的缩写,可以理解为打印对象。功能与p命令类似,也可以打印常量、变量,打印表达式返回的对象等。
    LLDB-p&po命令

    p 和 po 的区别在于使用 po 只会输出对应的值,而 p 则会返回值的类型以及命令结果的引用名。

ps: 使用p做进制转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//默认打印为10进制
(lldb) p 20
(int) $0 = 20
//转16进制
(lldb) p/x 10
(int) $1 = 0x0000000a
//转8进制
(lldb) p/o 10
(int) $2 = 012
//转二进制
(lldb) p/t 10
(int) $3 = 0b00000000000000000000000000001010
//字符转10进制数字
(lldb) p/d 'A'
(char) $4 = 65
//10进制数字转字符
(lldb) p/c 66
(int) $5 = B\0\0\0

2. bt命令(thread backtrace堆栈打印简写)

  • bt命令可以打印出线程的堆栈信息,bt命令是打印当前线程的堆栈信息,如下图所示。该信息比左侧的Debug Navigator 看到的还要详细一些。如果嫌堆栈打印太长,可以加一个值限制,如bt 10。
    bt命令
  • bt all 命令可以打印所有线程的堆栈信息。
    bt-all命令

3. 内存读取命令

  • x命令就是memory read内存读取并打印的作用, x是读取内存的命令
    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进制。
    x-4gx命令

4. thread list命令

  • 用于列出所有线程,如下图所示,其中星号(*)表示thread#1为当前线程。
    thread-list命令

5. 待续。。。


源码探索的的三种方法

  • 符号断点方式调试流程
  • 通过按住control+step into按钮逐步进入调试
  • 汇编源码跟流程

1. 打符号断点方式调试流程

选择编译器调试中的Symbolic Breakpoint断点调试
例如:探索alloc方法,添加Symbolic Breakpoint断点,即可查看到alloc源码位于libobjc.A.dylib库中,如下图:
alloc方法探究

2. 通过按住control+step into按钮逐步进入调试

在相应的alloc处打上断点,当执行到断点处时,按下control+step into即可逐步调试
stepinto调试
stepinto调试2
调试结果依然可以看到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的版本

-------------本文结束感谢您的阅读-------------