【问题标题】:Missing symbol names when profiling IPhone application with Instruments使用 Instruments 分析 iPhone 应用程序时缺少符号名称
【发布时间】:2011-02-16 02:46:24
【问题描述】:

我正在通过命令行编译一个 iPhone 应用程序(因此不涉及 XCode 选项),我无法在使用 Instruments 进行分析时显示我的符号名称。我尝试了几个标志,例如 -gdawrf-2 和 -g 都没有成功。我也尝试过使用 dsymutils 生成一个 .dSYM 文件,但我不知道我应该如何使用它,所以也失败了。

任何帮助将不胜感激!

【问题讨论】:

  • 我创建了一个“配置文件”构建配置来处理这个问题。请参阅 my answer 到类似的 Stackoverflow 问题。

标签: iphone xcode profiling instruments symbols


【解决方案1】:

我将项目设置更改为在构建时不包含 dSYM 文件:

将其更改为包含 dSYM 文件有助于分析器对符号进行去符号化并解决了我的问题:

【讨论】:

  • 我认为这不能回答问题,因为您的屏幕截图来自 Xcode,并且问题故意排除了 Xcode(@mac-twist 正在使用命令行),但我正在使用 Xcode 并且有这个问题,谷歌引导我解决这个问题,你的建议对我有用 - 谢谢。
  • 我遇到了同样的问题,并且使用带有调试构建选项的仪器和 Xcode。这对我有用。 Xcode 7.3.1 & iOS 9.3.4
  • 非常有趣的是,Debug 默认不包含 dSYM 文件! :/感谢分享这个。分析现在显示所有符号! :)
  • @Jona:生成 dSYM 文件的缺点是构建时间要长得多——这就是为什么 Debug 构建默认不包含它们的原因,因为您通常希望能够快速构建和运行。
  • 我猜这就是为什么默认情况下 Xcode 会在您选择“构建用于分析”时进行“发布”构建
【解决方案2】:

我仍然有这个问题。

我的问题是我能够看到正在生成的 dSYM 文件,但 Instruments 没有找到它。

要解决此问题,请执行以下操作:

  1. 找到您的 dSYM 文件(应该在 ~/Library/Developer/DerivedData/APP_NAME-XXXXXXX/Build/Products/[BUILD_TYPE]-[DEVICE-TYPE]/
  2. Instruments 停止后,点击 File -> Re-Symbolicate Document
  3. 向下滚动到包含您的应用名称的条目
  4. 点击“定位”并选择步骤 1 中的文件夹
  5. 单击“开始”按钮开始分析

【讨论】:

  • 我喜欢这个解决方案,因为它不依赖 Spotlight 来工作。它也是唯一为我解决了这个问题的人。谢谢!
  • 但现在我必须重复执行此操作,每次运行。有什么办法让它粘住吗?
  • 哦,而且,对于最新版本的 XCode,DerivatedData 位于您的 项目 的目录中,而不是在 ~/Library 中。
  • @bendytree 我刚刚将目标中的签名从分发更改为开发人员,这很有帮助。
  • 这对我有用,但在 Xcode 7 上我不必找到 dSYM。我只需要转到文件>符号并点击完成并修复它。如果您确实需要定位 dSYM,DerivedData 现在位于 ~/Library/Developer/Xcode/DerivedData。
【解决方案3】:

Instruments 如何获取调试信息:

Instruments 从 .dSYM 文件中获取调试信息,该文件通常在将调试信息格式设置为 DWARF 时由 XCode 自动生成,同时 dSYM 文件与“生成调试符号”选项框中的复选标记相结合。设置这些选项将为 XCode 构建过程添加一个额外的步骤,并在编译应用程序后生成一个 dSYM 文件。每个 dSYM 都使用 UUID 构建,该 UUID 对应于派生它的二进制文件的 Mach-O 部分中的 UUID。 Spotlight 导入器为 Mac 上 Spotlight 可访问位置中的每个 dSym 文件的 UUID 编制索引。因此 SPOTLIGHT 做了所有的黑魔法,负责在您正在运行的 .app 与其对应的 .dSYM 文件之间建立链接。

如何在没有 XCode 的情况下生成调试信息和 dSYM 文件:

确保您使用 –gdwarf-2 和 -g 标志进行编译。 (其他标志组合可能有效)

-g 产生调试信息 操作系统的本机格式 (刺、COFF、XCOFF 或 DWARF 2)。 GDB 可以使用此调试 信息。在大多数使用 stabs 格式,-g 允许使用额外的 只有 GDB 的调试信息 可以使用;这个额外的信息使 调试在 GDB 中效果更好,但会 可能使其他调试器崩溃或 拒绝阅读程序。如果你 想确定是否要控制 生成额外信息,使用 -gstabs+、-gstabs、-gxcoff+、-gxcoff 或 -gvms(见下文)。海合会允许 您将 -g 与 -O 一起使用。捷径 由优化的代码可能 偶尔会产生惊喜 结果:您声明的一些变量 可能根本不存在;控制流 可能会短暂地移动到你没有移动的地方 期待它;有些陈述可能不是 执行,因为他们计算 恒定的结果或它们的值是 已经到手了;一些陈述可能 在不同的地方执行,因为 他们被移出循环。
尽管如此,事实证明可以 调试优化输出。这使它 合理地使用优化器 可能有错误的程序。

-gdwarf-2 以 DWARF 版本 2 格式生成调试信息 (如果支持)。这是 DBX 在 IRIX 6 上使用的格式。 这个选项,GCC 使用的特性 DWARF 版本 3 有用时; 版本 3 向上兼容 版本 2,但仍可能导致 旧调试器的问题。

使用 dsymutil 生成 dSYM 文件。如果在命令行中无法识别该工具,请使用 Spotlight 查找它。 重要提示:如果您在网络驱动器上工作,请在生成 dSYM 之前将 .app 文件放在您的 mac HD 上。

dsymutil MyApp.app/MyApp -o MyApp.app.dSYM

将 .dSYM 文件放在 mac 的本地驱动器上,然后像往常一样运行 Instruments。

重置聚光灯的索引:

如果没有显示符号,可能是因为聚光灯有问题。您可以尝试通过将包含 dSYM 文件(甚至您的驱动器)的文件夹添加到 Spotlight 首选项中的“防止 Spotlight 搜索这些位置”,然后立即将其删除来重置 Spotlight 的索引。

【讨论】:

  • 谢谢。我之前从 Spotlight 索引中排除了我的 Xcode DerivedData 文件夹,以帮助 Spotlight 找到正确的 .dsym 来表示崩溃日志。删除它就可以了。
  • 虽然它可能需要 Finder 才能显示隐藏文件夹,并且需要使用拖放功能才能将文件夹临时添加到未索引的文件夹列表中,但它确实对我很有用删除后,再次索引
  • 这发生在我们身上,因为出于性能原因,我们将调试信息格式从“带有 dSYM 文件的 DWARF”更改为“DWARF”。我们在另一个方案中将格式设置为“DWARF with dSYM File”。所以我们只需要在我们想要分析的时候改变方案。
【解决方案4】:

在 Xcode 4.5 中,您可以选择从 Debug 或 Release 构建进行 Profile。复制到设备时,Release 默认剥离符号。在不破坏发布配置的情况下,切换到 Debug 配置进行分析非常容易。为此,请从 XCode 菜单中选择 Product -> Edit Scheme。从出现的方案列表中选择“配置文件”,然后为此选择正确的构建配置。

或者您可以进行单独的发布/配置文件配置,并在方案的配置文件部分使用它。 XCode User Guide 中描述了如何添加单独的构建配置。

【讨论】:

  • 另外,如果您正在构建分析,请务必检查“配置文件”方案,它已分配一些构建配置生成调试符号,如 Debug! (是我的问题)
【解决方案5】:

使用 Xcode 6 Instruments,您可以提供 dSYM 文件如下:

  • 文件 -> 符号... 菜单(停止分析时)
  • 选择您的应用并按定位按钮
  • 选择包含 dSYM 的路径(通常~/Library/Developer/DerivedData/APP_NAME-XXXXXXX/Build/Products/[BUILD_CONFIGURATION]-[TARGET_PLATFORM]/)。 提示:您可以从终端复制此路径并在对话框中使用 OS X 快捷方式⌘+SHIFT+G

此外,Instruments 会询问您以后是否应该使用选定的路径来尝试为此应用加载 dSYM。回答是的:)

【讨论】:

    【解决方案6】:

    花了三天时间试图为 Xcode 7.1/7.3 解决这个问题...

    将部署目标更改为最新版本(当时为 9.3)为我解决了这个问题。我的公司以 7.0 为目标,因此我可能必须创建一个自定义方案来分析 Instruments 中的代码,以避免在我们进行生产发布时更改目标(或忘记更改目标)。

    如果 dSYM 无法根据部署目标工作,这似乎是一个错误?

    【讨论】:

    • +1 对于这个答案,我基本上已经尝试了所有我能找到的与 dSYM 文件、聚光灯、构建方案、调试符号格式等相关的东西。没有任何东西可以解决任何问题,但切换到最新的部署目标符号立即被发现。现在我想起来了,我认为这可能也解释了为什么调试导航器在以较低的部署目标运行时从不显示任何内存或 CPU 统计信息。苹果没有弹出某种警告或其他任何东西的方式:-/
    【解决方案7】:

    问题是 Spotlight 找不到 .dSYM 文件。 这是因为 Apple 更改了 DerivedData 文件夹的位置。 DerivedData 现在进入 ~/Library

    Spotlight 不会为 ~/Library 编制索引,据我所知,也无法编制索引(例如 mdimport 被忽略)。

    在分析器中获取符号的解决方法是简单地将数据复制到 ~/Library 之外,例如你的主目录就可以了。

    我使用了这个命令行:

    $ cp -r ~/Library/Developer/Xcode/DerivedData/AppName-xxxxxxxxxxx/Build/Products/Release-iphoneos/ ~/
    

    当您终止分析器并开始新的分析运行时,您将看到符号再次可用。

    【讨论】:

      【解决方案8】:

      检查构建日志并确保您的 -g 开关正在进入编译器 - 在为不同构建配置等更改项目和/或目标级别的设置时很容易出错。

      【讨论】:

      • 标志在那里,我检查了四次。
      【解决方案9】:

      Xcode 4 附带的 Instruments 版本中的另一个解决方法是使用 Instruments 的 File 菜单下的 Re-Symbolicate Document 菜单项。此菜单项允许您使用位于 ~/Library/... 目录中的 .dSYM 文件中的符号。

      【讨论】:

        【解决方案10】:

        根据我的经验,这通常是因为在目标设备上安装最近修改的应用程序版本之前调用了“配置文件”。

        尝试在设备/目标上运行该应用,然后在重新安装后再次调用“配置文件”。

        【讨论】:

          【解决方案11】:

          我遇到了这个问题,因为 XCode 项目位于 Spotlight 找不到 dSYM 文件的网络共享上。确保它在本地驱动器上。

          【讨论】:

            猜你喜欢
            • 2012-08-20
            • 2011-03-19
            • 2012-03-10
            • 2010-09-26
            • 2017-04-20
            • 2012-01-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多