问题
- iOS/tvOS崩溃日志中找不到任何符号。
原因
应用崩溃后可以找到崩溃日志但找不到符号,原因是dSYMs没有载入。
解决方案
当函数名未被符号化时:
0 <my_games_name> 0x0123d88c 0xa3000 + 18458764
1 <my_games_name> 0x0165a650 0xa3000 + 22771280
2 <my_games_name> 0x010fbbac 0xa3000 + 17140652
3 <my_games_name> 0x0182b774 0xa3000 + 24676212
...
27 <my_games_name> 0x012408d4 0xa3000 + 18471124
您可以使用Xcode内建的系统,使用.dSYM文件自动转译崩溃日志。当.dSYM文件对spotlight可见时(例如在开发用机上),该系统会在崩溃日志打开时自动进行转译。如果您想在其他机器上检视崩溃日志,则您需要这些.dSYM文件。您还可以利用Unity Cloud Build来达成这一点。如果您打算了解.dSYM文件在未部署机器上的自动symbolicate原理,请点击这里参阅symbollicate Unity Cloud Build。
在iTunes Connect中,如果您的应用上传了.dSYM文件,崩溃日志同样会被symbolised。我们推荐您使用此种方式,因为您只能使用构建游戏时创建的.dSYM文件来symbolicate。.dSYM文件是在Xcode应用程序构建准备阶段生成的。如需了解更多关于.dSYM文件以及如何生成,去哪里找到这些文件,请参阅这里。
或者您也可以使用Xcode lldb命令使用崩溃报告中显示的地址来获得函数的名称,操作步骤如下:
- 禁用stripping并构建应用
- 在Main.mm中设置一个断点
- 在Xcode控制台中使用如下命令:image lookup - address
(lldb) image lookup --address 0x012408d4
您应牢记一点,二进制数据的载入偏移可能有所不同,您可以在回调栈中观测到这一点(偏移是0xa3000)。在这种情况下,您应减去原有的偏移并在当前debug绘画中添加这一偏移量。
如果您遇到任何与系统库有关的问题,不管是您的代码还是Unity相关的代码您都可以围绕该问题进行检查。
0 libsystem_platform.dylib 0x000000019726ce5c 0x197268000 + 20060
1 libsystem_c.dylib 0x00000001971253e0 0x197124000 + 5088
2 MyNewPlugin 0x000000010003ac70 0x10002c000 + 60528
3 UIKit 0x000000018d5f90b0 0x18d5b0000 + 299184
除了使用应用程序的dSYM,您还可以使用崩溃设备上对应的iOS版本提供的框架,例如iOS 8.1.1版本的UIKit symbol。
xcrun atos -arch arm64 -o ~/Library/Developer/Xcode/iOS DeviceSupport/8.1.1 (12B436)/Symbols/System/Library/Frameworks/UIKit.framework/UIKit -l 0x18d5b0000 0x000000018d5f90b0
更多关于命令行 symbolication的信息可以在此查阅。
注意:Unity Support同样需要您的程序构建.dSYM文件来symbolicate您的请求。如果您直接向Support发送symbolicate处理后的文件会更方便一些。
属性
本文适用于Unity 4.6.0f1及以上版本,XCode 6及以上版本,iOS 6.0及以上版本。