【问题标题】:Swift debugger does not show variable values when importing ObjC frameworkSwift 调试器在导入 ObjC 框架时不显示变量值
【发布时间】:2015-09-22 00:57:40
【问题描述】:

当我使用 Sprite Kit 创建一个新的 OS X“游戏”项目,并在任何我能看到变量值的地方设置断点时:

然后我更改代码以导入我自己的框架(TilemapKit),这是一个纯 Objective-C 框架:

import SpriteKit
import TilemapKit

class GameScene: SKScene {
    override func didMoveToView(view: SKView) {
        print("dang!")
    }
}

没有进行其他更改。我什至没有使用任何 TilemapKit 代码(还)。当断点触发时,我看到:

就观察变量值而言,整个项目不再可调试。这种行为是完全一致的。如果没有框架导入,我可以再次调试。

由于我使用的是 Xcode 7 beta (7A121l) 和 OS X 10.11 开发者预览版,我知道这可能只是一个(临时)错误。

命令行磁贴设置为使用 Xcode 7.0 版本顺便说一句。我尝试在框架目标中启用模块,确保部署目标相同(10.11),禁用符号剥离。我添加了一个 Bridging Header 并在其中 #imported TilemapKit 框架(在这种情况下删除 Swift 导入仍然会给我不可调试的应用程序,所以我如何或在何处导入框架似乎并不重要)。

是否有人对可能导致此行为的原因以及我如何解决它 - 或者至少我可以如何尝试缩小问题范围提出建议?

罪魁祸首是否更可能与项目的构建设置与框架的构建设置有关?我是否需要在应用项目中启用某些功能以使其与 ObjC 框架兼容? (我已经在其他链接器标志中获得了 -ObjC)


更新:

我在调试控制台中运行po self,发现这个通知:

<built-in>:3:6: error: module 'TilemapKit' was built in directory '/TilemapKit.framework' but now resides in directory './TilemapKit.framework'
#define __clang_major__ 7
     ^
missing required module 'TilemapKit'
Debug info from this module will be unavailable in the debugger.

framework build 目录怎么变了?为什么这很重要以及如何解决这个问题?

PS:新的 ObjC 应用中的相同框架可以正常调试。

【问题讨论】:

  • 即使我在使用 Twitter 提供的一组新框架时也面临同样的问题。无法调试任何东西。只显示变量名,除此之外什么都没有。对我来说,它显示了这个错误。 error: module 'Fabric' was built in directory '/Fabric.framework' but now resides in directory './Fabric.framework'
  • 很高兴知道,听起来像是一个普遍的问题。
  • XCode7beta3 中的同样问题
  • Xcode 11.2.1 仍然存在,老实说 Apple。 5 年期。

标签: xcode debugging frameworks swift2 xcode7-beta2


【解决方案1】:

我收到来自 Apple 开发人员的消息,称他们已发现此问题,可以通过将 .framework 移至项目的子文件夹来解决此问题。

显然,module .. was built in directory 错误仅在 .framework 与 .xcodeproj aka $(PROJECT_DIR) 位于同一文件夹中时才会出现。

但是,在我的情况下,将框架移动到子文件夹并不能解决问题,但在更新的 Xcode 7 测试版中解决此问题(仍然在测试版 3 中出现)之前,它仍然值得一试。

【讨论】:

  • 我刚刚确认了这项工作。您还需要在构建设置中更新框架搜索路径
  • 这个解决方案解决了我的问题的一半。 Facebook 和 Parse 的框架是在项目级别安装的,并且可以将它们移动到子文件夹中。但是其他框架,如 Alamofire 和 SwiftyJSON,与 Carthage 一起安装,然后设置为“嵌入式二进制文件”,仍然触发了这个问题。在 Carthage 的框架搜索路径末尾添加一个“/”完全解决了这个问题。 "$(PROJECT_DIR)/Carthage/Build/iOS/"
  • 对此赞不绝口。调试器重新开始工作。
【解决方案2】:

在我的情况下,这是因为我的项目中有多余的 import 语句。

我的项目混合了 swift 和 objc 文件,所以我在 bridging_header.h 文件中有导入语句。

在我的bridging_header.h 我有#import blah.h

在其中一个 swift 文件中,我从框架中导入了一个多余的标头 @import blah // From blah.framework

我从 swift 文件中删除了多余的导入,这似乎已经修复了它。

【讨论】:

  • 对我来说,有必要从桥接头中删除导入标头并将框架导入添加到 swift 文件中。
  • 这很好用。我已经通过 cocoapods 安装了 openSSL,它破坏了调试器。检查桥接头后,我注意到 pkcs7.h 已在其他地方声明。评论后它又开始工作了。这么愚蠢的事情,2小时过去了
【解决方案3】:

我可以确认这发生在 Xcode 版本 7.0 beta 4 (7A165t) 中。我必须删除我的 ObjC 框架才能返回调试值。如果无法删除您的框架,则 print 方法是老式的调试方法,但仍然有效。

【讨论】:

    【解决方案4】:

    我前段时间遇到过这个问题。在我的情况下,Prefix.pch 被包含在 Bridging-Header.h 中。这本身不是问题,但在我的 Prefix.pch 中有许多 C 包含使 lldb 无法导入桥接头。 所以我从 Bridging-Header 中删除了“#import Prefix.pch”,并将“#includes”复制到我需要在 swift 中使用的 obj-c 文件中。

    【讨论】:

      【解决方案5】:
      1. 调试配置的优化级别未设置为无。 对于如图 1 所示的 Objective-C 应用程序和如图 2 所示的 Swift 应用程序,请务必将其设置为 None。

      1. 在方案编辑器的运行操作设置窗格中,构建配置弹出菜单设置为发布。 在 Xcode 中,通过选择 Product > Scheme > Edit Scheme... 打开方案编辑器,在方案操作窗格中为您的应用选择 Run 操作,然后将 Build Configuration 设置为 Debug,如图 3 所示。

      【讨论】:

        【解决方案6】:

        转到左上角的编辑方案。

        如果是release,则将配置更改为Debug

        【讨论】:

        • 就像我说的,只要我注释掉导入行,问题就会消失。当然这是一个调试版本。
        • OP 表明他能够看到变量,这只有在 Debug 中才有可能。他所做的更改是包含一个导入。
        猜你喜欢
        • 2019-10-02
        • 2020-09-14
        • 2011-03-14
        • 1970-01-01
        • 2015-01-25
        • 2015-09-14
        • 2011-06-05
        • 1970-01-01
        • 2021-02-17
        相关资源
        最近更新 更多