Xcode - UUID与框架dSYM不匹配

时间:2013-02-13 18:51:44

标签: objective-c xcode macos frameworks symbolicatecrash

我有一个OSX桌面Xcode项目,其中包含另一个Xcode项目(框架)作为依赖项。当我构建应用程序的存档时,它会生成两个dSYM包 - 一个用于app,另一个用于框架。

当我表示从应用程序收到的崩溃时,应用程序包中的符号会正确显示(带有文件名和行号)。但是,框架中的符号根本不符号 - 它们只显示框架名称和内存地址。有没有办法用符号表示涉及框架代码的堆栈跟踪部分?

查看我生成.app包的存档,框架的dSYM的UUID与被复制到.app中的“Frameworks”文件夹的文件不匹配:

存档文件中.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

vs 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

2 个答案:

答案 0 :(得分:5)

我不确定为什么你的构建会导致dSYM UUID不一致。当我们进行这些类型的构建时(现在已经检查了几个),我们有一致的UUID。

然而,在回答你的问题时,如果你已经收到了你已经收到的崩溃报告,你已经收到了你已经收到的.dSYMs(假设目前虽然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

P.S。如果安装了开发工具,atos应安装/usr/bin/atos

答案 1 :(得分:1)

我也遇到过这个问题。经过一番调查,结果发现Xcode正在将 debug 框架构建复制到发布版本中,但显然是从正确的发布二进制文件创建dSYM。

尽管使用Xcode从工作区添加框架依赖项。最终我找到了原因:框架被包含在项目的位置和#34;相对于Group&#34;由于某些原因。在我确定所有人都是#34;相对于Build Product&#34;之后,它解决了我的问题。不是说它是唯一可能的原因,但是值得仔细检查构建日志中的所有路径,因为在这种情况下Xcode不会发出任何警告。

enter image description here