Xcode 4的Instruments工具不显示源代码行

28
我刚开始使用Xcode 4进行开发,但不管我如何配置项目中的调试符号,Instruments都无法显示与我的代码对应的堆栈跟踪项的源代码行。它仅显示十六进制偏移量,并将我的可执行文件标识为所属模块。打开“源位置”也没用。即使是由Xcode生成的骨架OpenGL ES项目(File → New → New Project... → iOS → Application → OpenGL ES Application)也是如此。

这个问题只出现在Instruments中(到目前为止我已经尝试了CPU和OpenGL跟踪)。Gdb能够很好地捕捉调试符号。

我需要在Instruments中执行特殊操作才能看到堆栈跟踪的源代码吗,还是这是Xcode 4的一个错误?

到目前为止,我已经:

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

49

其他回答提供了很好的长期解决方案。如果您不想等待 Spotlight 重建索引,只需要为一个Instruments会话获取符号,则可以要求Instruments对当前会话进行符号化。

  1. 选择文件→重新符号化文档... 重新符号化菜单项的截图
  2. 在出现的列表中找到您的二进制文件。它应该与Springboard上看到的名称相同。选择您的二进制文件,然后点击“定位”。 输入图像描述
  3. 回到Xcode,在.app构建产品上Ctrl+单击并选择“在Finder中显示”。 右键菜单截图显示在Finder中的项目
  4. 这将显示包含您的二进制文件以及其dSYM文件的目录。回到Instruments,导航到此目录,并选择您的dSYM文件。最简单的方法是直接从Finder将dSYM文件拖到Instruments中的“选择dSYM”对话框中。
  5. 最后,在Instruments中点击“符号化”。现在,您应该在跟踪中看到符号而不是十六进制偏移量。

5
谢谢,这很有帮助。如果你在 Finder 或打开文件对话框中找不到“Library”文件夹,请前往终端并执行以下命令:chflags nohidden ~/Library - Jon
1
+1000...对我来说,Spotlight在Xcode4中从未正常工作过(Spotlight中有太多的错误),我从未找到有效的解决方法。你为我节省了很多痛苦!PS:Xcode需要摆脱对Spotlight的依赖;Spotlight是一个可怕的索引解决方案,而Xcode有特殊的需求——它不应该依赖于一个“不可靠”的索引器! - Adam
4
我的二进制文件没有在列表中列出(如2所述)。有人遇到过这个问题并找到解决方案吗? - Clafou
这是我在XCode 4.6中唯一有效的方法(在XCode 4之前,它只是起作用 - 但后来在某个时候被破坏了)。非常感谢,每次这样做都不方便,但总比什么都没有好! - Mike Keskinov
1
我的二进制文件也没有列在列表中。还有其他人遇到这个问题吗?有解决方案吗? - Engin Kurutepe
显示剩余2条评论

45

我今天遇到了这个问题并用以下方法解决:

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

就应该可以了。需要注意的是,出于某种原因,构建目标未设置为与配置文件目标相同的构建配置,这已经让我犯了不止一次的错误。


11
在发布版本中进行性能分析会得到与调试版本截然不同且更有用的结果。将Profile设置切换为Debug并不是一个好主意。 - OldPeculier
4
这是正确答案。在Debug模式下应该使用调试器进行性能分析。在Release模式下应该使用发布版本进行性能分析。 - Nitzan Wilnai
调试设置是我必须做的。我一直在尝试重新符号化,但在发布版本中,调试符号被剥离,因此无法进行符号化。这是使用我的发布设置(基本上是默认设置)时出现的问题。谢谢! - doozMen
尝试过这个,但不幸的是我的调用树仍然只显示十六进制地址。 - jowie
@rraallvv:是的,你真正需要做的就是将构建配置与配置文件配置匹配。 - JonnyBoy
显示剩余2条评论

3
尝试为“发布”配置选择不同的“代码签名身份”,即预配置文件。

对我来说可行,但它是完全随机的行为。 - Alexander
发布时默认情况下会剥离调试符号。这样就似乎无法进行符号化处理了。 - doozMen

2
我发现了问题所在,因为我遇到了完全相同的问题。
答案来自:Missing symbol names when profiling IPhone application with Instruments
  1. 确保你已经启用了调试标志来编译你的代码(例如 -g3)。
  2. 对你想要访问调试信息的二进制文件/动态库执行 dsymutil
这将生成一个 dSYM 包文件夹,当被 Spotlight 索引时,必要的调试信息就会被提供给 Instruments。
我想在你的情况下,可能需要一些时间让 Spotlight 进行索引 - 当它完成后,事情就像魔术般地解决了。

2

仪器没有符号的原因可能是Spotlight无法找到dSYM文件。因此,从DWARF with dSYM变更为DWARF并不是个好主意。你应该将其改回来,因为没有dSYM文件,你就无法获取符号(至少在Snow Leopard中似乎是这样,我看到有些人报告说他们也没有dSYM文件就能得到符号,然而这些人都在使用Lion)。在进行更改后,请确保创建一个清洁的构建(有时Xcode在我的系统上无法为非干净的构建生成dSYM文件)。

如果经过所有尝试之后仍然无法获得符号,则可能是您的Spotlight数据库出现了问题。尝试将包含dSYM文件的文件夹添加到Spotlight不应索引的文件夹列表中,然后再将其从该列表中删除。这会导致Spotlight重新索引文件。

如果这仍然无法解决问题,可能是你的Spotlight索引完全损坏了。在这种情况下,请在终端上尝试以下操作:

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

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

第二行有一个错别字(mduitlmdutil)。无法修复,因为在Stack Overflow上的更改必须是6个或更多字符。天哪! - Rudolf Adamkovič

1
在新版的Instruments中(我使用的是5.1.1(55045)版本),您可以添加额外的路径来搜索dSYMs和源代码。
打开Instruments的首选项,然后单击“dSYMs和路径”选项卡。

Preference tabs

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

Add a search path to the list


1

它突然开始工作了,没有任何原因。

我花了半个小时尝试让它再次失败,希望在这里提供一个更有用的答案,但是我无法做到,即使重新创建了骨架OpenGL程序并追溯了所有步骤。

我确实在emacs中打开了symbolicatecrash脚本(在其他地方已经涉及到这种问题),并且在我这样做之后它开始工作了。 但是在任何时候我都没有更改或保存它。

这是一个谜。


8
对于Xcode 4来说,这听起来就是正常的情况。有些东西似乎会神秘地工作,然后突然又能用了。我开始觉得苹果在这个IDE里加入了一些厉害的人工智能。 - Alan Zeino
1
你的评论让我开心极了,Alan : D - Macmade

0

这是我的环境...

  • XCode 8.2
  • Mac OS v10.12 Sierra

我在模拟器中遇到了同样的问题,所有标准的解决方法都不起作用,这让我很烦恼。

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

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

  • libsqlite3.tbd而不是libsqlite3.dylib
  • libstdc++.6.tbd而不是libstdc++.dylib

我不知道为什么会这样,但这是我失去符号的唯一项目更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接