我正在通过命令行编译一个 iPhone 应用程序(因此不涉及 XCode 选项),并且在使用 Instruments 进行分析时无法显示我的符号名称。我尝试了几个标志,例如 -gdawrf-2 和 -g 都没有成功。我也尝试过使用 dsymutils 生成一个 .dSYM 文件,但我不知道我应该如何使用它,所以也失败了。
任何帮助将不胜感激!
我正在通过命令行编译一个 iPhone 应用程序(因此不涉及 XCode 选项),并且在使用 Instruments 进行分析时无法显示我的符号名称。我尝试了几个标志,例如 -gdawrf-2 和 -g 都没有成功。我也尝试过使用 dsymutils 生成一个 .dSYM 文件,但我不知道我应该如何使用它,所以也失败了。
任何帮助将不胜感激!
我将项目设置更改为在构建时不包含 dSYM 文件:
将其更改为包含 dSYM 文件有助于分析器对符号进行去符号化并解决了我的问题:
我仍然有这个问题。
我的问题是我能够看到正在生成的 dSYM 文件,但 Instruments 没有收到它。
要解决此问题,请执行以下操作:
Instruments 如何获取调试信息:
Instruments 从 .dSYM 文件中获取调试信息,该文件通常在将调试信息格式设置为 DWARF 时由 XCode 自动生成,其中 dSYM 文件结合了 Generate Debug Symbols 选项框中的复选标记。设置这些选项将为 XCode 构建过程添加一个额外的步骤,并在编译应用程序后生成一个 dSYM 文件。每个 dSYM 都使用 UUID 构建,该 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 允许您将 -g 与 -O 一起使用。优化代码所采取的捷径有时可能会产生令人惊讶的结果:您声明的某些变量可能根本不存在;控制流可能会短暂地移动到您没有预料到的地方;某些语句可能无法执行,因为它们计算常量结果或它们的值已经在手边;有些语句可能在不同的地方执行,因为它们被移出循环。
尽管如此,事实证明可以调试优化的输出。这使得将优化器用于可能有错误的程序是合理的。-gdwarf-2 以 DWARF 版本 2 格式生成调试信息(如果支持)。这是 IRIX 6 上 DBX 使用的格式。使用此选项,GCC 在有用时使用 DWARF 版本 3 的功能;版本 3 与版本 2 向上兼容,但仍可能会导致旧调试器出现问题。
使用 dsymutil 生成 dSYM 文件。如果在命令行中无法识别该工具,请使用 Spotlight 查找它。重要提示:如果您正在使用网络驱动器,请在生成 dSYM 之前将 .app 文件放在您的 mac HD 上。
dsymutil MyApp.app/MyApp -o MyApp.app.dSYM
将 .dSYM 文件放在 mac 的本地驱动器上,然后像往常一样运行 Instruments。
Resettig 聚光灯的索引:
如果没有显示符号,可能是因为聚光灯被窃听了。您可以尝试通过将包含 dSYM 文件(甚至您的驱动器)的文件夹添加到 Spotlight 首选项中的“防止 Spotlight 搜索这些位置”,然后立即将其删除来重置 Spotlight 的索引。
在 Xcode 4.5 中,您可以选择从 Debug 或 Release 构建中进行 Profile。复制到设备时,Release 默认剥离符号。在不破坏发布配置的情况下,切换到 Debug 配置进行分析非常容易。为此,请从 XCode 菜单中选择 Product -> Edit Scheme。从出现的方案列表中选择“配置文件”,然后为此选择正确的构建配置。
或者,您可以进行单独的发布/配置文件配置,并在方案的配置文件部分使用它。XCode 用户指南中描述了如何添加单独的构建配置。
使用Xcode 6 Instruments,您可以提供dSYM文件,如下所示:
⌘+SHIFT+G
您可以从终端复制此路径并在对话框中使用 OS X 快捷方式。Instruments还会询问您将来是否应该使用选定的路径来尝试为此应用程序加载 dSYM。回答是的:)
花了三天时间试图为 Xcode 7.1/7.3 解决这个问题......
将部署目标更改为最新版本(当时为 9.3)为我解决了这个问题。我的公司以 7.0 为目标,因此我可能必须创建一个自定义方案来分析 Instruments 中的代码,以避免在我们进行生产发布时必须更改目标(或忘记更改目标)。
如果 dSYM 无法根据部署目标工作,似乎这可能是一个错误?
问题是聚光灯找不到 .dSYM 文件。这是因为 Apple 更改了 DerivedData 文件夹的位置。DerivedData 现在进入 ~/Library
Spotlight 不会索引 ~/Library并且据我所知,也不能索引它(例如 mdimport 被忽略)。
在分析器中获取符号的解决方法是简单地将数据复制到 ~/Library 之外,例如您的主目录就可以了。
我使用了这个命令行:
$ cp -r ~/Library/Developer/Xcode/DerivedData/AppName-xxxxxxxxxxx/Build/Products/Release-iphoneos/ ~/
当您终止分析器并开始新的配置文件运行时,您将看到符号再次可用。
检查构建日志并确保您的-g
开关正在通过编译器 - 在更改项目设置和/或不同构建配置的目标级别等时很容易出错。
Xcode 4 附带的 Instruments 版本中的另一个解决方法是使用Instruments 的 File 菜单下的Re-Symbolicate Document菜单项。此菜单项允许您使用位于 ~/Library/... 目录中的 .dSYM 文件中的符号。
根据我的经验,这通常是因为在目标设备上安装最近修改的应用程序版本之前调用了“配置文件”。
尝试在设备/目标上运行应用程序,然后在重新安装后再次调用“配置文件”。
我遇到了这个问题,因为 XCode 项目位于 Spotlight 找不到 dSYM 文件的网络共享上。确保它在本地驱动器上。