Xcode Swift 调试器不会显示在 if 语句中创建的变量

Posted

技术标签:

【中文标题】Xcode Swift 调试器不会显示在 if 语句中创建的变量【英文标题】:Xcode Swift debugger won't display variables created within if statement 【发布时间】:2020-09-16 19:14:02 【问题描述】:

这在最近的 Xcode 11 (版本 11.7) 中变得更加普遍。我正在逐步执行代码,但在一个部分中 po 拒绝工作,并且变量显示列出了一些不可用的变量。这些文件总是在正确的目标成员中,所以我将其归因于线程问题,因为它经常发生在后台线程中。

更新:删除记录调用路径后现在可以访问 但在这种情况下,我可以 po 这个函数中的每个变量,除了在 if 语句中创建的 url。特别是 print(url) 行打印:

"this/is/my/path -- file:///"

但停在同一行 po url 打印:

错误::3:1:错误:使用未解析的标识符“url”

在同一行 po 消息 打印:

“播放器失败并出现错误:未知。\nInternet: true, UserData: None\nURL: file://this/is/my/path”

final class MyVideoController: UIViewController 
    var testPathForURL: String? = "file://this/is/my/path"

    override func viewWillAppear(_ animated: Bool) 

       super.viewWillAppear(animated)
    
       // happens on main thread
       test(error: nil)
    


extension MyVideoController 
    private func test(error: NSError?) 
        let errorString = error?.description ?? "Unknown"
        let errorSummary = "Player failed with error: \(errorString)"
        let userInfo = error?.userInfo.description ?? "None"
        let message: String = "\(errorSummary).\nInternet: \(true), UserData: \(userInfo)\nURL: \(testPathForURL ?? "NONE")"
        print(message)
        let filePrefix = "file://"
        if let fullPath = testPathForURL, fullPath.hasPrefix(filePrefix) 
            // Delete cached video so problem won't occur again.
            let path = String(fullPath.dropFirst(filePrefix.count))
            print(path)
            let url = URL(fileURLWithPath: path)
            do 
                print(url)
                try FileManager.default.removeItem(at: url)
             catch 
                print(error)
            
        
    

更新:当我在 try FileManager 行停止并使用 po 的替代品时会发生以下情况:

(lldb) v url
(URL) url = <variable not available>

(lldb) e url
error: <EXPR>:3:1: error: use of unresolved identifier 'url'
url
^~~

(lldb) p url
error: <EXPR>:3:1: error: use of unresolved identifier 'url'
url
^~~

另外,我已经清理并重建,重新启动 Xcode,重新启动我的 Mac,并重新安装 Xcode 工具。

更新

我最近在这台机器上单独使用 Xcode 12 的 beta 版本构建了项目,但相信在那之前就发生过类似的调试器事件。

我已经处理了很长时间的另一个可能的症状是调试器在断点处停止时偶尔需要很长时间(分钟)来加载变量列表(6 核 2018 Mac mini 和 32千兆位内存)。我以为只有在我的 5s 测试设备上调试时才会发生这种情况,但它偶尔也会在模拟器上发生。

【问题讨论】:

你试过强制关闭然后重新打开 Xcode 吗?我知道这听起来很愚蠢,但通常它对我有用。 也可以试试pexprv。我的意思是如果打印工作并且你在打印发生的那一行断点,即在同一个线程上,那么对我来说这只是一个 Xcode 错误...... 很大程度上取决于您暂停的位置。我们无法运行你给的代码,所以,耸耸肩,没什么好说的。请给出一个可重现的示例,并准确说明如何重现该问题。然后我们可以谈论一个实际的案例,而不是所有这些模糊的挥手。 我们也不知道哪个版本的 Xcode 有问题。但最好提及 Xcode 的确切版本 我明白这一点,但我仍然无法试用该代码。请提供一个我可以试用代码的示例。 【参考方案1】:

事实证明这是 Lldb 调试器的一个已知问题,可能会因拥有如此大的项目而加剧。

https://forums.swift.org/t/lldb-is-slow-to-resolve-local-vars/32517/41

【讨论】:

以上是关于Xcode Swift 调试器不会显示在 if 语句中创建的变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中将 javascript console.log 到 println() 到 Xcode 调试器?

iPhone 7 设备日志不会显示在 Xcode 的调试器中

Xcode 调试器不再显示违规行,而是始终显示 UIApplicationMain

Xcode 调试器不显示变量的值?

实例化的可选变量在 Xcode 调试器中显示为 nil

Xcode 6.1 if/else/for/switch 语句不自动完成(仅限 Swift)