来一点调试技巧,lldb 的 Scripting Bridge 框架,新手友好的 Debug 进阶

本文介绍了如何利用lldb的Scripting Bridge框架进行调试,包括基础的lldb命令、Python脚本扩展、Xcode断点的使用以及通过nudge脚本修改移动控件布局。强调了lldb的Python接口可以实现定制化和动态调试,简化了UI全局断点和刷新界面的过程。
摘要由CSDN通过智能技术生成

常常羡慕前端开发、RN 、Flutter 和 SwiftUI 开发的 live rendering, 即时渲染

别家项目的框架,UI 开发,修改了,很容易渲染出来。无需每次手动漫长的编译

其实,lldb 自带了一个 python 解析器。要调试代码逻辑,不需要重新编译, kill 进程。

当前进程下,可以直接调试。

常用的是,苹果封装的一些命令。也可以根据自己的工程,自己写定制化的 python 脚本

基础:先搞清楚常用命令的含义

常用三连,ppov

lldb 很强大,开发者常用 ppov

  • 使用  ppov, 查看当前函数帧的变量

po , expression --object-description , 使用对象描述的表达式,简单理解为 print object ,打印对象

p, expression, 就是不带对象描述的 po,

ppo 只是 lldb 中,简单的别名。


v, frame variable, 函数帧变量

Swift 中,编译时声明的类型,可以与运行时赋值过去的类型,不一致。

v 多了一个类型解析功能,Type Resolution

ppo,是根据编译时的数据类型操作。当然可以用as 做一个类型强转,cast 到运行时的类型。

v ,可以直接取出实际数据,也就是运行时的数据。( 如果编译与运行类型不一致,lldb 中需要手动输入字符串,没有代码自动补全)

po 与 p 和 v 的不同.png


  • 通过  ppo,执行代码语句

看数据,v 优先。执行代码语句, ppo 优先。

v 直接访问调试信息,直接读内存。步骤相对少,

ppo 需要去解析和执行。多了一些 JITing,跑代码的工作。


这些在 Xcode 的控制台,点一下暂定按钮, 开启 lldb,  都可以知道的

0.png

help 大法好
  • 看看  p
(lldb) help p
     Evaluate an expression on the current thread. 
     // ...
     'p' is an abbreviation for 'expression --'
     // p 是 expression -- 的缩写
  • 看看 po
(lldb) help po
     Evaluate an expression on the current thread.  Displays any returned value
     // ...
     'po' is an abbreviation for 'expression -O  --'
    // po 是 expression -O  -- 的缩写
  • 看看 v
    (lldb) help v
    // v 怎么用的,说的很清楚
    // ...
    'v' is an abbreviation for 'frame variable'
   // v 是 frame variable 的缩写

简单的例子:

代码


struct Trip{

    var name: String

    var destinations: [String]

}

extension Trip: CustomDebugStringConvertible{

    var debugDescription: String{

        "Trip 的描述"

    }

}

func one(){

    let cruise = Trip(name: "Alone", destinations: ["Pain", "Great", "V", "me"])

    // 断点于此

    print("Place Holder")

}

one()

print("Place Holder")

结果:


(lldb) po cruise

▿ Trip 的描述

  - name : "Alone"

  ▿ destinations : 4 elements

    - 0 : "Pain"

    - 1 : "Great"

    - 2 : "V"

    - 3 : "me"

(lldb) expression --object-description -- cruise

▿ Trip 的描述

  - name : "Alone"

  ▿ destinations : 4 elements

    - 0 : "Pain"

    - 1 : "Great"

    - 2 : "V"

    - 3 : "me"

(lldb) p cruise

(One.Trip) $R18 = {

  name = "Alone"

  destinations = 4 values {

    [0] = "Pain"

    [1] = "Great"

    [2] = "V"

    [3] = "me"

  }

}

(lldb) expression cruise

(One.Trip) $R20 = {

  name = "Alone"

  destinations = 4 values {

    [0] = "Pain"

    [1] = "Great"

    [2] = "V"

    [3] = "me"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值