iOS - Advanced Debugging with Xc

2020-12-01  本文已影响0人  ienos

一、Add BreakPoint

1. 代码中添加断点
image.gif
2. 根据断点类型添加
image.png image.png

二、 Edit Breakpoint

image.png image.png
1. Condition:

为断点设置条件

2. Action:
3. Options:

Automatically continue after evaluating actions 执行完后跳过断点

三、Watch Variable

变量值被修改时暂停


1. 搜索过滤变量的名字
2. 右键 Watch "<Valiable>"
image.png

四、 代码注入

使用表达式 expression <expr>


1. Edit BreakPoint,添加一个 Debugger Command Action
image.png
2. 或者在 lldb 中输入 expression <expression>

如果我们利用 expression 进行一个 UI 的修改,这时屏幕可能未能及时渲染,需要再运行 expression CATransaction.flush() 刷新界面

在 Swift 框架中注入 OC 代码 expression -l obj -O --<expression>

五、代码跳过

1. 使用表达式 thread jump --by 1
image.png
2. 移动指针指令的汉堡菜单

可以将指针指令跳转到任意位置,但是这里并不能保证 app 的状态完好无损,有可能会引起内存管理问题, 例如: 试图引用尚未初始化的对象,或者过早释放的对象

image.gif

六、Symbolic BreakPoint

在调用某个方法的时候触发断点


image.png

则在系统调用 -[UILabel setText:] 时会触发断点,通过堆栈我们可以看到是哪些代码调用了该方法

  1. 在 lldb 中我们可以通过 po $arg1($arg2, etc)来获取方法的参数值 $arg1 第一个参数

  2. 如果需要在运行某段代码之后进行方法监听,可以添加一个 BreakPoint,然后 Edit BreakPoint

七、LLDB: p / po / v(Xcode10.2)

Shortcut Expression Function
po <expression> expression --object-description --<expr> 1. Expression: evaluate <expr> 2.Expression: debug Description
p <expression> expression --<expr> 1. Expression: evaluate <expr> 2.Outputs LLDB-formatted description
frame variable <name> 1. Reads value of <name> from memory 2. Outputs LLDB-formatted description

po 和 p 可以访问当前执行的完整语言,v 有自己的语法

1. po
image.png
func __lldb_expr() {

    __lldb_res = view

}
func __lldb_expr2 -> String() {

    return __lldb_res.description

}
2. p
image.png

动态类型解析


例如 Protocol: Activity / Class: Trip

且 Trip 遵循 Activity 协议

let cruise: Activity = Trip()

当我们 p cruise 时,控制台会打印 cruise 作为 Trip 类型的所有描述

由于我们在代码中的静态代码表达,是 Activity 类型,所以当 p cruise.name 时编译时会发生错误

即 p 只对格式化结果进行一次动态类型解析

需要对类型进行格式转换 p (cruise as! Trip).name 才能访问属性


3. v(frame variable)
image.png
上一篇 下一篇

猜你喜欢

热点阅读