【问题标题】:Symbolic breakpoints in SwiftSwift 中的符号断点
【发布时间】:2015-07-14 18:49:22
【问题描述】:

是否可以在 Swift 中为基于 swift 的代码设置符号断点?

假设我有一个类似的课程

class AwesomeSauce {

    var ingredients: [String]

    init(useIngredients:[String]) {
        ingredients = useIngredients
    }
}

假设ingredients 数组的排序类似于

var specialSauce = AwesomeSauce(["Sugar","Spice","Everything Nice", "Chemical 'X'"])

specialSauce.ingredients.sort({ $0.length() > $1.length() })

我们还假设(因为我没有注意)我在整个项目的许多不同位置对这个数组进行排序。

我想看看ingredients 何时被排序。

有没有办法可以在Array.sort()AwesomeSauce.ingredients.sort() 或类似的东西上设置符号断点?

我似乎什么也做不了,我尝试了各种可能的符号排列。

【问题讨论】:

  • 我认为问题在于您要添加“()”。如果您添加参数说明符,lldb 会认真对待您,并且没有不带参数的 Swift.Array.sort。除非你真的需要中断一个函数的重载,否则只给出不带参数的函数标识符要容易得多。事实上,即使您想在重载上中断,也更容易在名称上中断,然后禁用除您想要的重载之外的所有位置,因为完全正确地获取参数通常是一件痛苦的事......

标签: swift lldb


【解决方案1】:

Swift.Array.sort 上设置符号断点应该可以解决问题。

这是一个使用 swiftc 和 lldb 的命令行示例会话, 但你可以在 Xcode 中做同样的事情:

$ xcrun -sdk macosx swiftc -g main.swift $ lldb 主要 (lldb) 目标创建“主” 当前可执行文件设置为“main”(x86_64)。 (lldb) b 主要 断点 1: where = main`main + 106 at main.swift:13, address = 0x0000000100001aea (lldb) 运行 进程 8032 启动:'./main' (x86_64) 7 个位置添加到断点 1 1 个位置添加到断点 1 4 个位置添加到断点 1 进程 8032 已停止 * 线程 #1:tid = 0x1c46ff,0x0000000100001aea main`main + 106 at main.swift:13,队列 = 'com.apple.main-thread',停止原因 = 断点 1.1 帧#0:0x0000000100001aea main`main + 106 at main.swift:13 10 } 11 } 12 -> 13 var specialSauce = AwesomeSauce(useIngredients: ["Sugar","Spice","Everything Nice", "Chemical 'X'"]) 14 15 specialSauce.ingredients.sort({ count($0) > count($1) }) 16 (lldb) b Swift.Array.sort 断点2: where = libswiftCore.dylib`Swift.Array.sort (inout Swift.Array)((A, A) -> Swift.Bool) -> (), address = 0x0000000100030160 (lldb) c 进程8032恢复 进程 8032 已停止 * 线程#1:tid = 0x1c46ff, 0x0000000100030160 libswiftCore.dylib`Swift.Array.sort (inout Swift.Array)((A, A) -> Swift.Bool) -> (), queue = 'com.apple.main -thread',停止原因 = 断点 2.1 帧 #0: 0x0000000100030160 libswiftCore.dylib`Swift.Array.sort (inout Swift.Array)((A, A) -> Swift.Bool) -> () libswiftCore.dylib`Swift.Array.sort (inout Swift.Array)((A, A) -> Swift.Bool) -> (): -> 0x100030160:pushq %rbp 0x100030161 : movq %rsp, %rbp 0x100030164:pushq %r15 0x100030166:pushq %r14 (lldb) BT * 线程#1:tid = 0x1c46ff, 0x0000000100030160 libswiftCore.dylib`Swift.Array.sort (inout Swift.Array)((A, A) -> Swift.Bool) -> (), queue = 'com.apple.main -thread',停止原因 = 断点 2.1 * 帧 #0: 0x0000000100030160 libswiftCore.dylib`Swift.Array.sort (inout Swift.Array)((A, A) -> Swift.Bool) -> () 帧#1:0x0000000100001c99 main`main + 537 at main.swift:15 帧#2:0x00007fff8cff65c9 libdyld.dylib`start + 1

【讨论】:

  • 在 Swift 4 中为Swift.Array.sort 工作。它确实适用于Swift.Array.popLast
  • 在尝试了许多不同的变体后,我发现只有 .sort 在 Xcode 9 中有效
猜你喜欢
  • 2017-02-12
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 1970-01-01
  • 2018-04-27
  • 2015-05-11
  • 1970-01-01
相关资源
最近更新 更多