debug技巧

deubg context

断点停在Objective-C代码,LLDB使用Objective-C上下文。

断点停在Swift代码,LLDB使用Swift上下文。

强制表达式使用OC上下文

1
2
3
// -l 使用的语言
// -O -- 等同po
(lldb) expression -l objc -O -- [UIApplication sharedApplication]

User defined variables

当你打印对象时LLDB会自动创建临时变量,你也可以自己创建变量。

比如有时想自建一个对象再去实验一些方法

1
2
3
(lldb) po id test = [NSObject new]
(lldb) po test
error: use of undeclared identifier 'test'

这样会有报错

你得使用$标记告诉LLDB你想记住的变量

1
2
3
(lldb) po id $test = [NSObject new]
(lldb) po $test
<NSObject: 0x60000001d190>

xcode 11.3.1

符号断点:MasterContainerViewController.viewDidLoad 即有效

1
(lldb) p self

LLDB会创建变量$R0

continue后再手动暂停

此时$R0还持有引用

// 看看对引用计数的影响

1
2
3
4
5
6

(lldb) expression -l swift -- $R0.title
(String?) $R6 = "Quarterback" // 这里R后面的数字不是固定的
(lldb) expression -l swift -- $R0.title = "💩💩💩💩💩"
// command + ctrl + space 搜索poop
// 控制器的标题变成了一堆便便

我们还可以这样,创建一个断点,执行那个被持有变量的方法,命中断点

可以给方法不同输入观察其输出。TDD

1
2
// -i disable this option ->  by default, LLDB will ignore any breakpoints when executing commands
(lldb) expression -l swift -O -i 0 -- $R0.viewDidLoad()

Type formatting

GDB format

The full list of output formats is as follows (taken from https://sourceware.org/gdb/ onlinedocs/gdb/Output-Formats.html):

• x: hexadecimal

• d: decimal

• u: unsigned decimal

• o: octal

• t: binary

• a: address

• c: character constant

• f: float

• s: string

LLDB’s extra formatters

LLDB’s formatters can be used like this:

(lldb) expression -f Y – 1430672467

This gives you the following output:

1
(int) $0 = 53 54 46 55             STFU

This explains the FourCC code from earlier!
LLDB has the following formatters (taken from http://lldb.llvm.org/varformats.html): • B: boolean
• b: binary
• y: bytes
• Y: bytes with ASCII
• c: character
• C: printable character
• F: complex float
• s: c-string
• i: decimal
• E: enumeration
• x: hex
• f: float
• o: octal
• O: OSType
• U: unicode16
• u: unsigned decimal
• p: pointer

1
2
3
4
// -n 告诉LLDB查询符号与函数名
(lldb) image lookup -n "-[UIViewController viewDidLoad]"
(lldb) image lookup -rn test
// Note: 使用-n来进行精确查找。rn regex search