我有一个 OSX 桌面 Xcode 项目,其中包含另一个 Xcode 项目(框架)作为依赖项。当我构建应用程序的存档时,它会生成两个 dSYM 包 - 一个用于应用程序,一个用于框架。
当我对从应用程序收到的崩溃进行符号化时,应用程序包中的符号会正确显示(带有文件名和行号)。然而,框架中的符号根本没有符号化——它们只是显示框架名称和内存地址。有没有办法用符号表示涉及框架代码的堆栈跟踪部分?
查看我从中生成 .app 包的存档,框架的 dSYM 的 UUID 与复制到 .app 中“Frameworks”文件夹中的 UUID 不匹配:
存档文件中.app包内的HCCommon框架:
/path/to/HipChat.xcarchive $ dwarfdump --uuid Products/Applications/HipChat.app/Contents/Frameworks/HCCommon.framework/HCCommon
UUID: 84891A9C-19DB-3E16-BE7E-9D4056FFFB97 (x86_64) Products/Applications/HipChat.app/Contents/Frameworks/HCCommon.framework/HCCommon
对比HCCommon框架的dSYM(存档文件中的dSYMs目录下):
/path/to/HipChat.xcarchive $ dwarfdump --uuid dSYMs/HCCommon.framework.dSYM/Contents/Resources/DWARF/HCCommon
UUID: 767F2D97-9E0B-3C4D-8337-FDF5A9CA2D81 (x86_64) dSYMs/HCCommon.framework.dSYM/Contents/Resources/DWARF/HCCommon
最佳答案
我不确定为什么您的构建会导致 dSYM UUID 不一致。当我们进行此类构建时(现在抽查了一些),我们拥有一致的 UUID。
但是,在回答您关于如何使用您已经拥有的 .dSYM 符号化您已经收到的崩溃报告的问题时(暂时假设尽管 UUID 匹配,但它们指的是相同的代码,因此会工作)。
如果您必须强制执行特定的 dsym,我发现以下方法可以很好地工作:
atos -arch x86_64 -o <path_to_dsym_within_package> -l <offset_of_framework>
它肯定不是那么漂亮,通常我通过 atos 手动运行各个地址,但结果是一个有效的例程/行组合(假设您匹配正确的版本等)
<path_to_dsym_within_package>
指foo.framework.dSYM/Contents/Resources/DWARF/foo
后跟您的二进制名称,其中 foo
是框架的名称。对于我们来说,这也适用于任何类型的插件。
<offset_of_framework>
来自崩溃日志中的偏移量列,其中:
0 libsystem_kernel.dylib 0x7fff8e785ce2 0x7fff8e76f000 + 93410
1 libsystem_c.dylib 0x7fff871afa7a 0x7fff8716e000 + 268922
2 CTUtils 0x104e26c62 0x104e17000 + 64610
在这种情况下,第一个十六进制数是地址,第二个十六进制数是特定框架的起始偏移量,+ 值是框架内的十进制偏移量。
您需要上面命令行的第二个数字(十六进制偏移量)和第一个数字来查找特定例程/行号。
在最坏的情况下,总是使用 dwarfdump
直接使用:
dwarfdump <path_to_dSYM> --arch x86_64 --lookup <offset>
<path_to_dSYM>
是顶级“.dSYM”文件夹的路径(与上面的 atos
命令不同),并且 <offset>
是模块内的偏移量,不如atos
方便.
附言atos
应该安装在 /usr/bin/atos
如果您安装了开发工具。
关于objective-c - Xcode - UUID 与框架 dSYM 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14860827/