根据 .crash文件符号化堆栈信息,这个操作你可能并不陌生,详细可以看.crash文件符号化
下面👇总结一下主要的命令:
查看dSYM文件的UUID如下
dwarfdump --uuid Your.app.dSYM
或者:
dwarfdump --uuid Your.app.dSYM/Contents/Resources/DWARF/Your
crash文件的UUID
grep "appName armv" *crash
或者
grep --after-context=2 "Binary Images:" *crash
我们可以手动从mach-O文件中提取.dsym文件
$ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/dsymutil /Users/wangzz/Library/Developer/Xcode/DerivedData/YourApp-cqvijavqbptjyhbwewgpdmzbmwzk/Build/Products/Debug-iphonesimulator/YourApp.app/YourApp -o YourApp.dSYM
==========
认识崩溃堆栈
以下面的崩溃堆栈为例:
从上述堆栈中第3行可以看到,应用崩溃发生在运行时地址0x0000000104d93244,该进程的运行时起始地址是0x0000000104918000,崩溃处距离进程起始地址的偏移量为十进制的4698692(对应十六进制为0x47B244)。三者对应关系:
0x0000000104d93244 = 0x0000000104918000 + 0x47B244
对应的公式为:
运行时堆栈地址 = 运行时起始地址 + 偏移量
崩溃堆栈中的起始地址和崩溃地址均为运行时地址,根据虚拟内存偏移量不变原理,只要提供了符号表TEXT段的起始地址,再加上偏移量(这里为0x47B244)就能得到符号表中的堆栈地址,即:
符号表堆栈地址 = 符号表起始地址 + 偏移量
atos简单使用
开发者能获取到错误堆栈信息,而使用atos工具就是把地址对应的具体符号信息找到。它是一个可以把地址转换为函数名(包括行号)的工具
atos无需计算崩溃地址对应的符号表地址的方式,命令格式如下:
atos -o Your.app.dSYM/Contents/Resources/DWARF/Your -arch armv7 -l 0x0000000104918000 0x0000000104d93244
其中 -l 选项指定了二进制文件在运行时的起始地址0x0000000104918000,后面跟的是崩溃发生的运行时地址0x0000000104d93244,符号化结果如下:
或者
atos -o Your.app.dSYM/Contents/Resources/DWARF/Your -arch armv7 -l loadaddr
回车
然后输入崩溃地址
根据项目的dYSM符号化堆栈信息就是这样,但是对于系统库的符号化,还需要系统库的符号文件参考:iOS系统库符号化
参考: