使用Instruments对iPhone应用程序进行性能分析时,缺少符号名称。

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

我创建了一个名为“Profile”的构建配置来解决这个问题。请参见我在类似的Stackoverflow问题中的答案 - fishinear
11个回答

110

我更改了项目设置,编译时不包括dSYM文件:

图片描述

将其更改为包括dSYM文件有助于剖析器解码符号并解决我的问题:

图片描述


我不认为这个回答解决了问题,因为你的截图来自Xcode,而问题故意排除了Xcode(@mac-twist正在使用命令行),但我正在使用Xcode并且遇到了这个问题,谷歌将我引导到了这个问题,并且你的建议对我有用 - 谢谢。 - dumbledad
我遇到了同样的问题,使用仪器和带有调试构建选项的Xcode。这对我有用。Xcode 7.3.1&iOS 9.3.4。 - Jerry Chen
4
很有趣,调试默认不包含dSYM文件! :/ 谢谢分享。现在进行分析可以显示所有符号! :) - Jona
3
@Jona:生成dSYM文件的缺点是构建时间显著延长-这就是为什么默认情况下调试构建不包括它们的原因,因为您通常希望能够快速构建和运行。 - Slipp D. Thompson
2
我猜这就是为什么当你选择“构建用于分析”时,Xcode默认会进行“发布”构建的原因。 - Glenn Schmidt
这解决了我的自定义符号问题,但是像AppKit和Foundation这样的系统库怎么办?有没有一种方法可以将它们符号化,使我的工具栈跟踪更加透明? - Alexander

69

我仍然遇到了问题。

我的问题是,虽然我能看到dSYM文件已经生成,但Instruments没有识别它。

为了解决这个问题,请执行以下操作:

  1. 找到您的dSYM文件(应该在~/Library/Developer/DerivedData/APP_NAME-XXXXXXX/Build/Products/[BUILD_TYPE]-[DEVICE-TYPE]/中)
  2. 停止Instruments,然后单击“文件”->“重新符号化文档”
  3. 向下滚动到带有您的应用程序名称的条目
  4. 点击“定位”,然后选择第1步中的文件夹
  5. 单击“开始”按钮开始分析

当我尝试重新符号化时出现了错误(关于dSYM文件和应用程序没有匹配的UUID),所以我只是删除了[BUILD_TYPE]-[DEVICE-TYPE]/文件夹中的所有文件(参见上面的步骤1),然后重复该过程,然后它就起作用了。耶! - Vern Jensen
2
哦,还有,使用最新版本的XCode,DerivatedData位于您项目的目录中,而不是~/Library。 - Vern Jensen
6
@bendytree,我刚刚将目标中的签名从分发改为开发者,这样有所帮助。 - k06a
@k06a,您能详细说明一下吗? - ndmeiri
2
这对我有用,但在Xcode 7上,我不需要定位dSYM。我只需要转到文件>符号,然后点击完成即可修复它。如果您确实需要定位dSYM,则DerivedData现在位于〜/ Library / Developer / Xcode / DerivedData。 - Liron Yahdav
显示剩余3条评论

42
从工具(Instruments)获取调试信息的方法:
Instruments从.dSYM文件中获取调试信息,该文件通常是在XCode中将“Debug Information Format”设置为“DWARF with dSYM File”,并勾选“Generate Debug Symbols”选项框时自动生成的。设置这些选项将在XCode构建过程中添加一个额外的步骤,并在应用程序编译完成后生成dSYM文件。每个dSYM都带有一个UUID,与它派生自的二进制文件中的Mach-O部分中的UUID相对应。Spotlight导入程序会索引您Mac上每个可通过Spotlight访问的位置中的dSym文件的UUID。因此,Spotlight执行黑魔法,并负责将您运行的.app文件与其相应的.dSYM文件进行链接。
如何在没有XCode的情况下生成调试信息和dSYM文件:
确保使用-gdwarf-2和-g标志编译。(其他标志组合可能也可以)

-g 以操作系统的本地格式(stabs、COFF、XCOFF或DWARF 2)生成调试信息。 GDB可以使用这些调试信息。在大多数使用stabs格式的系统上, -g启用了只有GDB能够使用的额外调试信息;这些额外信息使得GDB中的调试工作更加顺畅, 但很可能会导致其他调试器崩溃或拒绝读取程序。 如果您想要控制是否生成额外的信息,请使用-gstabs+、-gstabs、-gxcoff+、-gxcoff或-gvms(见下文)。 GCC允许您在-O选项中使用-g。优化代码采取的快捷方式可能会产生令人惊讶的结果: 您声明的某些变量可能根本不存在;流程控制可能会短暂地移动到您没有预料到的位置; 一些语句可能不会执行,因为它们计算出常数结果或者它们的值已经准备好了; 一些语句可能在不同的位置执行,因为它们被移出了循环。
尽管如此,这仍然证明了生成调试信息是可能的。

调试优化输出。这使得针对可能存在缺陷的程序使用优化器非常合理。

-gdwarf-2 生成DWARF版本2格式的调试信息(如果支持的话)。IRIX 6上的DBX使用此格式。使用此选项时,GCC在有用时使用DWARF版本3的功能;版本3向上兼容版本2,但仍可能对旧调试器造成问题。

使用dsymutil生成dSYM文件。如果命令行中未识别该工具,则使用Spotlight查找它。 重要提示:如果您正在使用网络驱动器,请将.app文件放在Mac硬盘上生成dSYM之前。

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

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

重置Spotlight的索引:

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


2
谢谢。我之前已经从 Spotlight 索引中排除了我的 Xcode DerivedData 文件夹,以帮助 Spotlight 找到正确的 .dsym 文件来符号化崩溃日志。移除它就解决了问题。 - joerick
虽然可能需要Finder能够显示隐藏文件夹,并且需要使用拖放功能将文件夹暂时添加到未索引文件夹列表中,但在将其删除后,它对我来说非常有效,可以再次进行索引。 - petershine
这种情况发生是因为出于性能原因,我们将“DWARF with dSYM文件”调试信息格式更改为“DWARF”。在另一个方案中,我们将格式设置为“带有dSYM文件的DWARF”。因此,每当我们想进行性能分析时,我们只需要更改方案即可。 - Liron Yahdav

15

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

或者,您可以创建单独的release/profile配置,并在方案的Profile部分中使用该配置。如何添加单独的构建配置在XCode用户指南中有描述。


1
另外,如果您正在进行性能分析的构建,请务必检查“Profile”方案,以确认它是否已分配一些生成调试符号(例如Debug!)。这就是我的问题所在。 - k3a

7

使用 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中对代码进行分析,以避免在生产发布时需要更改目标(或忘记更改目标)。

如果dSYMs未能基于部署目标运行,那么似乎这很可能是一个错误?


3
对这个答案点赞,我基本上尝试了所有与dSYM文件、Spotlight、构建方案、调试符号格式等相关的方法,但没有解决任何问题。但是将部署目标切换到最新的版本后,符号立即被找到了。现在想想,我认为这也解释了为什么以较低的部署目标运行时调试导航器从未显示任何内存或CPU统计信息。非常感谢Apple没有弹出任何警告之类的东西 :-/ - w0utert

2
问题在于 Spotlight 无法找到 .dSYM 文件,这是因为 Apple 更改了 DerivedData 文件夹的位置。DerivedData 现在在 ~/Library 中。
Spotlight 将不会索引 ~/Library,据我所知,也不能被强制索引(例如 mdimport 将被忽略)。
将数据复制到 ~/Library 以外的位置,例如您的主目录,可以通过一个解决方案来获得剖析器中的符号。
我使用了以下命令行:
$ cp -r ~/Library/Developer/Xcode/DerivedData/AppName-xxxxxxxxxxx/Build/Products/Release-iphoneos/ ~/

当您关闭分析器并开始新的分析时,您会发现符号再次可用。

1
请检查构建日志,并确保您的 -g 开关已传递给编译器 - 当在不同的构建配置上更改项目和/或目标级别的设置时,很容易弄错这一点。

旗帜已经在那里了,我已经四次检查过了。 - Mac Twist

1
根据我的经验,通常出现这种情况是因为在目标设备上安装最新版本的应用程序之前已经调用了“Profile”。请尝试在设备/目标上运行应用程序,然后在重新安装后再次调用“Profile”。

1
在 Xcode 4 自带的 Instruments 版本中,另一个解决方法是使用“文件”菜单下的重新符号化文档菜单项。此菜单项允许您使用位于 ~/Library/... 目录中的 .dSYM 文件中的符号。

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