【问题标题】:LLDB 'thread return' command emits error in a Swift functionLLDB 'thread return' 命令在 Swift 函数中发出错误
【发布时间】:2016-11-18 16:52:51
【问题描述】:

我正在阅读Dancing in the Debugger — A Waltz with LLDB 文章。我正在尝试使用 Swift 2.2 和 Swift 3.0 的 thread return 命令。

我的代码很简单:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let resust = test()
        print(resust)
    }

    func test() -> Bool {
        return true
    }
}

我在test() 函数的开头添加了一个断点,并带有thread return false 操作。但是,在 command+R 之后,我的程序按预期在断点处停止,但出现以下错误:

“错误:从线程1的第0帧返回错误:我们目前只支持设置简单的整数和浮点返回类型..”

这是一个屏幕截图:

然后我在 Objective-C 代码中尝试了同样的方法;一切顺利。

【问题讨论】:

  • Swift Bools 被实现为结构,因此它不是“简单的整数和浮点返回类型”。它在 ObjC 中有效,因为 ObjC BOOL 只是原始类型的 typedef。
  • 我尝试了thread return 10(or other number) 作为操作,但是程序仍然停止并出现同样的错误。 :(
  • 也许它被隐式转换为布尔值,因为 Swift 线程容器是类型安全的?
  • @Leviathlon 我不知道。

标签: swift lldb


【解决方案1】:

这些是已知的错误。 Swift 中的值类型(Int、Bool 等)都是复杂的对象,我们还没有教 lldb 如何覆盖它们的返回值。错误处理也会使这变得棘手。

一般来说,强制返回是不安全的 - ARC 更是如此,Swift 更是如此,因为你可能会不平衡引用计数 - 不仅在本地,而且可能在传入的对象上。

【讨论】:

  • 没有。我们也不支持 C 中 thread return 中的结构返回。这是一个有点专业的功能,实现起来相当棘手,所以它还没有排到任何人的首位。
  • 感谢您的解释。拥有此功能将允许在调试时临时更改某些逻辑而无需重新编译应用程序,这在某些情况下非常有用。我希望 LLDB 有一天能学会“线程返回”更复杂的对象 :)
猜你喜欢
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-19
  • 2015-03-04
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
相关资源
最近更新 更多