Chr*_*s R 11 macos xcode frameworks objective-c symbolicatecrash
我有一个OSX桌面Xcode项目,其中包含另一个Xcode项目(框架)作为依赖项.当我构建应用程序的存档时,它会生成两个dSYM包 - 一个用于app,另一个用于框架.
当我象征从应用程序收到的崩溃时,应用程序包中的符号会正确显示(带有文件名和行号).但是,框架中的符号根本不符号 - 它们只显示框架名称和内存地址.有没有办法用符号表示涉及框架代码的堆栈跟踪部分?
查看我生成.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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我不确定为什么您的构建会导致不一致的dSYM UUID。当我们进行这类构建时(现在已经抽检了几次),我们具有一致的UUID。
但是,在回答有关如何符号化已经给定.dSYM的已收到崩溃报告的问题时(假设目前,尽管UUID匹配,但它们引用的代码相同,因此可以使用)。
如果必须强制使用特定的dsym,我发现以下方法可以很好地工作:
atos -arch x86_64 -o <path_to_dsym_within_package> -l <offset_of_framework>
Run Code Online (Sandbox Code Playgroud)
肯定不是那么漂亮,通常我会通过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
Run Code Online (Sandbox Code Playgroud)
在这种情况下,第一个十六进制数字是地址,第二个十六进制数字是特定框架的起始偏移量,而+值是框架内的十进制偏移量。
您需要上面命令行的第二个数字(十六进制偏移),以及第一个数字以查找特定的例程/行号。
在最坏的情况下,总是通过以下方式dwarfdump直接使用:
dwarfdump <path_to_dSYM> --arch x86_64 --lookup <offset>
Run Code Online (Sandbox Code Playgroud)
<path_to_dSYM>是顶级“ .dSYM”文件夹的路径(与atos上面的命令不同),并且<offset>是模块内的偏移量,不如方便atos。
如果已安装开发工具,atos则应安装PS /usr/bin/atos。