【问题标题】:Xcode 4 Instruments doesn't show source linesXcode 4 Instruments 不显示源代码行
【发布时间】:2011-07-13 04:30:17
【问题描述】:

我刚开始使用 Xcode 4,发现无论我如何在项目中设置调试符号,Instruments 都拒绝显示与我的代码对应的堆栈跟踪项的源代码行。 In 仅显示十六进制偏移量并将我的可执行文件标识为拥有模块。打开“源位置”也会产生空白。即使是 Xcode 生成的骨架 OpenGL ES 项目也会出现这种情况(文件 → 新建 → 新建项目... → iOS → 应用程序 → OpenGL ES 应用程序)。

这个问题只发生在 Instruments 中(到目前为止我已经尝试过 CPU 和 OpenGL 跟踪)。 Gdb 可以很好地提取调试符号。

我是否必须做一些特别的事情才能在 Instruments 中查看堆栈跟踪的源代码,或者这是 Xcode 4 中的错误?

到目前为止,我已经:

  • Debug Information FormatDWARF with dSYM File 更改为 DWARF
  • Strip Debug Symbols During CopyYes 更改为 No
  • 将构建方案更改为使用 Debug 构建而不是带有 Instruments 的 Release 构建。

【问题讨论】:

    标签: xcode debug-symbols xcode-instruments


    【解决方案1】:

    它刚刚开始工作;没有押韵或理由。

    我花了最后半个小时试图让它再次失败,希望在这里提供更有用的答案,但我不能,即使从头开始重新创建骨架 OpenGL 程序,追溯我所有的步骤。

    我确实在 emacs 中打开了 symbolicatecrash 脚本(它已在其他地方受到牵连,wrt 这种问题),并且在我这样做之后它开始工作。但我从未更改或保存它。

    这是一个谜。

    【讨论】:

    • 这听起来很适合 Xcode 4。事情只是神秘地不起作用,然后,他们就起作用了。我开始认为 Apple 在这个 IDE 中构建了一些严肃的 AI。
    • 你的评论让我很开心 Alan : D
    【解决方案2】:

    我发现了问题所在,因为我遇到了完全相同的问题。

    答案来自:Missing symbol names when profiling IPhone application with Instruments

    1. 确保您在编译代码时启用了调试标志(例如-g3)。
    2. 在您希望能够访问其调试信息的二进制/动态库上执行 dsymutil

    这会生成一个 dSYM 包文件夹,当 Spotlight 索引时,必要的调试信息会提供给 Instruments。

    我想在你的情况下,Spotlight 花了一些时间才将事物编入索引 - 当它有了索引时,事情就神奇地解决了。

    【讨论】:

      【解决方案3】:

      我今天遇到了这个问题并以这种方式解决了:

      1. 编辑方案
      2. 点击左侧的“个人资料”(这是重要的一步)
      3. 将构建配置更改为调试

      应该这样做。请注意,无论出于何种原因,构建目标都没有设置为与配置文件目标相同的构建配置,这让我绊倒了一两次以上。

      【讨论】:

      • Release 中的性能分析提供了与 Debug 中截然不同且更有用的结果。将配置文件设置切换到调试不是一个好主意。
      • 这是正确答案。 Debug 应该在 Debug 中进行分析。 Release 应该在 Release 中描述。
      • 调试设置是我必须做的。我一直在尝试重新符号化,但在发布时调试符号被剥离,因此符号化是不可能的。这是我的发布设置(或多或少是默认设置,唯一的好答案。谢谢!
      • 试过了,但不幸的是我的调用树仍然只显示十六进制地址。
      • 有没有办法通过目标构建设置也为发布配置启用此功能?
      【解决方案4】:

      仪器没有符号的一个原因可能是 Spotlight 找不到 dSYM 文件。所以你从DWARF with dSYM 更改为DWARF 不是一个好主意。你应该把它改回来,因为没有 dSYM 文件,无论如何你都不会得到符号(至少雪豹似乎是这种情况,我看到有报道说有些人也得到了没有 dSYM 文件的符号,但是,所有这些人正在使用狮子)。进行更改后,确保创建一个干净的构建(有时 Xcode 无法在我的系统上为非干净构建生成 dSYM 文件)。

      如果您仍然没有得到任何符号,那么您的 Spotlight 数据库有问题。尝试在构建后将包含 dSYM 文件的文件夹添加到 Spotlight 不应索引的文件夹列表中,然后再次将其从该列表中删除。这会导致 Spotlight 重新索引文件。

      如果这也没有帮助,可能是您的 Spotlight 索引已完全损坏。在这种情况下,请在终端上尝试以下操作:

      sudo mdutil -i off /
      sudo mdutil -E /
      sudo mdutil -i on /
      

      这会导致 Spotlight 首先停止索引您的主硬盘,然后删除过去收集的所有索引数据,然后开始重新索引。以上几行假设您的 dSYM 文件位于主硬盘驱动器上(而不是任何其他硬盘驱动器或网络卷上,否则您必须将“/”替换为该卷的适当安装点)。在您重试之前,请给 Spotlight 一些时间重新索引。

      【讨论】:

      • 第二行有一个错字(mduitl vs mdutil)。无法修复,因为 Stack Overflow 上的更改必须超过 6 个字符。天哪!
      • @RudolfAdamkovic:谢谢,修好了。
      【解决方案5】:

      其他答案是很好的长期修复。如果您不想等待 Spotlight 重建其索引而只需要为一个 Instruments 会话获取符号,您可以让 Instruments 符号化当前会话。

      1. 选择文件 → 重新符号化文档...
      2. 在出现的列表中找到您的二进制文件。它应该与您在 Springboard 上看到的名称相同。选择您的二进制文件并单击“定位”。
      3. 返回 Xcode。按住 Control 并单击您的 .app 构建产品并选择“在 Finder 中显示”。
      4. 这将显示包含您的二进制文件的目录及其dSYM 文件。返回 Instruments,导航到此目录,然后选择您的 dSYM 文件。最简单的方法是直接将 dSYM 文件从 Finder 拖到 Instruments 中的“Select dSYM”对话框中。
      5. 最后,点击 Instruments 中的“Symbolicate”。您现在应该在迹线中看到符号,而不是十六进制偏移量。

      【讨论】:

      • 谢谢 - 这很有帮助。进一步说明,如果您在查找器或打开文件对话框中看不到“库”文件夹,请转到终端并执行:chflags nohidden ~/Library
      • +1000 ... Spotlight 在 Xcode4 上对我来说永远无法正常工作(Spotlight 中的错误太多),而且我从未找到有效的解决方法。你救了我很多痛苦! ... PS:Xcode 需要转储 Spotlight 依赖; Spotlight 是一个糟糕的索引解决方案,Xcode 有特殊需求——它不应该依赖“不可靠”的索引器!
      • 我的二进制文件未列在列表中(根据 2。)是否有其他人遇到此问题并找到了解决方案?
      • 这是对我使用 XCode 4.6 的唯一方法(在 XCode 4 之前它只是工作 - 但后来在某些时候坏了)。非常感谢,每次都做不方便,但总比没有好!!!
      • 我的二进制文件也没有在列表中列出。其他人?解决方案?
      【解决方案6】:

      尝试为 Release 配置选择不同的代码签名身份,即配置文件。

      【讨论】:

      • 为我工作,但这是完全随机的行为。
      • Release 会在默认状态下去除调试符号。符号化似乎是不可能的。
      【解决方案7】:

      在较新版本的 Instruments(我有 5.1.1 (55045))中,您可以添加其他路径以搜索 dSYM 和源代码

      打开 Instruments' Preferences,然后点击“dSYMs And Paths”标签。

      然后将您的路径添加到列表中。

      【讨论】:

        【解决方案8】:

        这是我的环境...

        • XCode 8.2
        • Mac OS v10.12 Sierra

        我在模拟器中运行时遇到了同样的问题,这让我抓狂,因为所有标准的首选修复程序都不起作用。

        对我来说,它的作用是将我的 iPad 插入 MacBook 并针对我插入的 iPad 上的上述应用程序运行仪器会话。 Instruments 在 iPad 上运行时正确地符号化了我的应用程序,然后在我断开 iPad 并稍后在模拟器中运行仪器时继续工作。

        我怀疑这与更新我的项目以使用以下内容有关...

        • libsqlite3.tbd 代替 libsqlite3.dylib
        • libstdc++.6.tbd 代替 libstdc++.dylib

        我不知道为什么会这样,但这是我在 Instruments 中丢失符号之前所做的唯一项目更改。

        【讨论】:

          猜你喜欢
          • 2010-10-18
          • 1970-01-01
          • 1970-01-01
          • 2012-08-22
          • 2013-01-14
          • 2011-11-01
          • 2019-09-14
          • 2011-07-21
          • 2020-02-24
          相关资源
          最近更新 更多