一、使用流程
Windows下的程序运行崩溃时,往往可以利用pdb文件快速解析出程序崩溃的具体位置,甚至可以对应到源代码的具体行数。macOS下的symbolicatecrash也具备相应的功能。对应于Windows下的pdb文件,macOS下的crash文件解析需要用到dSYM文件。这个文件正常情况下可能不会生成,需要在XCode进行设置。当程序崩溃时,通过symbolicatecrash对crash文件和dSYM文件中的符号进行映射,即可将crash文件中的内存地址转换为可读的字符串。以前的博文中也进行过总结,但是并没有具体实践。这次在macOS下开发的一个程序总是崩溃,于是打算利用dSYM文件来看看到底是哪里崩溃了。
按照常规套路,先还是把*.crash文件、*.dSYM文件放到一起来,再来调用symbolicatecrash命令。先建立symbolicatecrash的软链接:
然后运行命令开始解析crash文件:
提示说“DEVELOPER_DIR”没有定义,那么就给他个定义:
再次运行命令开始接下工作:
提示:Unsupported crash log version: 12。往上搜索了一番,并没有什么发现。倒是发现了一些链接转而求其次使用了其他方法,就是不全文解析crash文件。而是解析我们感兴趣的内存地址的符号。其方法是:先找到Image的load address,如下:
这里我的程序在内存中的加载位置为0x10c680000(尖括号中的字符串是程序的UUID)。再次找到我们感兴趣的内存地址,如下:
再次运行命令:
至此即可分析出特定地址的符号了,调试的时候也可以确定大致的位置了。至于为什么不能全文解析crash文件暂时还不清楚。
二、参考链接
1. http://stackoverflow.com/questions/40056263/symbolicate-crash-log-xcode-8-macos-app
2. https://gist.github.com/bmatcuk/c55a0dd4f8775a3a2c5a
3. http://blog.csdn.net/duanyipeng/article/details/46460245