尽管所有构建设置都相反,Xcode Instruments 正在剥离符号

Posted

技术标签:

【中文标题】尽管所有构建设置都相反,Xcode Instruments 正在剥离符号【英文标题】:Xcode Instruments is stripping symbols despite all build settings to the contrary 【发布时间】:2012-06-28 09:09:00 【问题描述】:

问题

Instruments 的 Time Profiler 正在从我的应用程序中删除除系统库之外的所有符号,尽管事实上我已在 Xcode 的所有相关构建设置中禁用此行为 - 但仅在一台开发机器上。其他开发机器运行正常。

说明

Instruments 的 Time Profiler 正在剥离除系统库之外的所有符号,尽管事实上我已在 Xcode 的所有相关构建设置中禁用了此行为——但这仅发生在我的一台开发机器上。我有两台开发机器运行相同版本的 OS X、Xcode 和 Instruments,每台机器都使用相同 Xcode 项目的相同副本,具有相同的构建设置、方案和其他配置,并且应用程序使用相同的配置文件进行配置测试设备(iPhone 4S 最新公开版 ios 5)。

机器 1 - Mac OS X 10.7.4 - Xcode 4.3.2 (4E2002) - 仪器 4.3 (4321)

机器 2 - Mac OS X 10.7.4 - Xcode 4.3.2 (4E2002) - 仪器 4.3 (4321)

复制步骤

    在每台机器上打开包含的示例项目。 确保选择 iPhone 4S 作为测试设备。 选择产品 > 简介 Instruments 启动后,选择 Time Profiler 并继续。 运行应用程序。 注意在 iMac(机器 1)上运行时符号是如何被剥离的,但在 MacBook Air(机器 2)上却没有。

预期行为

我自己的代码中的符号应该出现在两台机器上的 Time Profiler 中。

回归

我已经尝试了以下所有方法,实际结果没有变化:

    重启机器。

    尝试其他 Xcode 项目

    删除 Xcode Organizer 中所有项目的“派生数据”。

    在 Instruments 中重新符号化文档(在 ~/Library/blahBlahBlah... 中仔细选择正确的 DSYM 文件)

最后说明

这里是一个示例项目的 .zip 文件的链接:Sample Project .zip

【问题讨论】:

【参考方案1】:

我终于能够通过一种与核武器和铺路方案相形见绌的方法让它发挥作用:

    绝对确保对您当前的构建配置禁用所有符号剥离。如果这是为 Instruments 分析的内容,请确保您已为发布配置完成此操作。 从 iOS 设备中删除应用程序。 重启 iOS 设备。 重新启动 Mac(我根本不相信 Xcode 或 Lion 会退出所有相关进程)。 启动 Xcode,转到 Organizer > Projects 并删除受影响项目的 Derived Data。 清理您的项目。见鬼,为什么不呢? 为 Instruments 构建和配置文件。 为了清楚起见,请在 Instruments 中选择 Time Profiler。 第一次运行将显示符号,但不要退出。让 Instruments 继续运行! 在 Instruments 中重新符号化文档,仔细导航到当前构建的正确 dSYM 文件。这应该更容易,因为您已在第 5 步中删除了派生数据。 现在您应该可以看到您的符号了。隐藏非客观 C 符号会有所帮助。

为什么我建议您在第 2 步和第 3 步中删除应用并重新启动 iOS 设备?我怀疑 Xcode 不会对每个构建执行全新安装,但可能会安装增量,这样 Instruments 中存在的符号地址是当前构建和以前构建的混合。如果是这样,那么对于像我这样在多个 Mac 之间共享单个测试设备的人来说,这个问题就更常见了。这个假设可能是非常不正确的。

如果上述步骤对您不起作用,请在 cmets 中告诉我。我想在未来的某个时间创建一份详细的雷达报告。

【讨论】:

我还没有测试过你的方法,但我相信它会起作用,因为它是一个完全干净的应用程序安装。但是,是的,请在此处提交雷达报告并进行更新,您将非常好:) 我无法做到这一点,当我选择 dsym 仪器时说:“重新符号化需要 MyApp.app.dSYM 和 AppleProfileKEventAction 具有匹配的 UUID。” 我不确定 AppleProfileKEventAction 是什么。我确实知道 .dSYM 文件有很长的 UUID 名称(在 Xcode 保存它们的任何目录中找到它们以了解我的意思)。让我知道你的发现。 您在选择 AppleProfileKEventAction 时选择了“定位”。您应该能够滚动到您的二进制文件,然后“定位”您的 dSYM 文件。但是我在那里找不到我的二进制文件... 你知道this problem能不能用你的方法解决吗?【参考方案2】:

我不确定它是否已在 4.3 中修复,但这是 4.2 中的一个已知问题seen here

仪器 Xcode 4.2 中的 Profile 操作存在一个已知问题。在没有更改源文件的构建之后,Instruments 将无法为目标应用程序收集符号。

这会影响两个项目:

    为配置文件操作选择了发布配置。 (默认) 条带链接产品构建设置设置为“是”,或 自定义运行脚本构建阶段会剥离产品。 (非默认)

解决方法是执行以下任一操作:

    在启动配置文件之前对产品执行“清洁” 行动。 对产品进行清洁并临时设置条带链接 分析时产品构建设置为“否”。 将 Profile 操作的配置设置为 Debug。 当您这样做时,直接从 Instruments 中运行连续的配置文件 不需要重建。开发 Mac 应用程序时,使用 GC Monitor Instruments 中的模板可能会导致 Instruments 崩溃。到 解决问题的方法请考虑将您的应用程序迁移到 弧。

【讨论】:

【参考方案3】:

我这几天也遇到了类似的问题。我能够分析调试配置,但不能分析发布。首先,我尝试制作发布配置的副本(如网络上某处建议的那样),但该副本也不起作用。

然后我复制了一份Debug,命名为Profile,试了一下,Profile的符号显示在profiler中。伟大的!然后我将优化级别等更改为与 Release 相同,现在它可以工作了!只是想分享这个,因为这个评论会节省我几个小时......

【讨论】:

这是这里最有用的评论!非常感谢,它奏效了。其他解决方案只会让我把头撞到墙上。就像“在 ~/Library/ 中定位 dSYM”一样,当打开的文件对话框根本不显示 ~/Library/ 时,它隐藏在 Mountain Lion 中...【参考方案4】:

一直面临同样的问题,偶然发现了这个帖子。

我意识到我首先使用发布版本对应用程序进行了分析,并且在 Xcode 中为同一个应用程序更改了方案之后,分析器仍然无法进行符号化。我已经尝试了你上面提到的所有明显的解决方案,但都是徒劳的。

分析器不知何故仍在引用第一个构建(发布构建)的设置,因此它无法符号化。因此,我只是出于测试目的更改了应用程序的包标识符,以便完全创建一个新应用程序用于分析目的。我可以检查现在存在泄漏的代码。

试试看,让我知道这是否也适合你。仍在思考为什么 Instruments 无法象征性。

【讨论】:

您是否尝试过从测试设备中删除应用程序,关闭并重新打开,然后重新构建它? 我怀疑 Xcode 不会对每个构建执行干净安装,但可能会安装 deltas,这样符号地址就会混合在一起。这种假设可能非常不正确。 是的,我怀疑是一样的。这就是为什么我创建了一个新的应用程序包标识符并在通配符配置文件中构建它。【参考方案5】:

我有一个类似的问题,我从命令行构建的 os x 应用程序中没有符号(所以在这种情况下,它不是 iphone 或 xcode 问题)。原来问题是由于包含我的 PATH 的错误 DYLD_LIBRARY_PATH 造成的。当我摆脱所有那些非库路径(例如 /usr/bin/)后,它就起作用了。

【讨论】:

【参考方案6】:

我有很多第三方框架,不幸的是它们的符号和二进制文件丢失了。

此外,我的应用程序的二进制文件丢失了。

即如果我选择文件 > 符号,单击我的目标,并找到名称相似的项目,则二进制路径显示为红色。

解决方案是转到 Instruments > Preferences > Symbols,并将 /Users/<MY_USER>/Library/Developer/Xcode/DerviedData 添加到搜索路径中。 Library 未被 Spotlight 索引。这样做之后,我至少有了我的应用程序的符号。当我这样做时,我的应用名称旁边的小圆圈会从黄色变为绿色,并且在重新启动 Instruments 之间持续存在,这与手动设置二进制文件的其他解决方案不同。

如果您能告诉我如何为我的第三方框架获取所有这些,请告诉我。我将 Carthage 用于一些,其他手动安装。这些还没有运气。

【讨论】:

【参考方案7】:

尝试打开 XCode 3 和他的 Organizer。并尝试从这个管理器中添加一个设备到两台机器。

只需打开 Organizer 并等待他处理。如果您看到“用于开发”按钮,请单击他。

有时,XCode 4 无法真正添加设备以进行全面开发。

【讨论】:

以上是关于尽管所有构建设置都相反,Xcode Instruments 正在剥离符号的主要内容,如果未能解决你的问题,请参考以下文章

尽管 Xcode 是最新的,但 iOS 应用程序提交会产生“无效的工具链”[重复]

即使构建设置具有调试信息格式 = 带有 dSYM 的 Dwarf,Xcode 也不会生成所有必需的 dSYM

构建纯Swift可可触摸框架

在 iOS6、XCode 4.5 中,UIScrollView 不滚动,尽管设置了 contentSize

你如何在 Xcode 中使用 Flutter Flavors

Xcode 基础工程结构解析