iOS Crash log符号化

针对没有符号化的crash log文件,需要配合dSYM文件和Xcode symbolicatecrash工具进行符号化,便于分析问题。

查找symbolicatecrash

find /Applications/Xcode.app -name symbolicatecrash -type f

结果示例:

/Applications/Xcode.app/Contents/Developer/Platforms/WatchSimulator.platform/Developer/Library/PrivateFrameworks/DVTFoundation.framework/symbolicatecrash
/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVSimulator.platform/Developer/Library/PrivateFrameworks/DVTFoundation.framework/symbolicatecrash 
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks/DVTFoundation.framework/symbolicatecrash 
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

将真机的版本symbolicatecrash拷贝到工作目录。

将crash.log和dSYM文件拷贝到工作目录

需要保证crash.log和dSYM的uuid是对应的,验证方式如下:

  1. 打开crash.log,找到slice_uuid:"UUID字符串";
  2. 获取dSYM的uuid:dwarfdump --uuid XX.app.dSYM,示例:
UUID: 8A3A1C4E-53DE-3B57-A98B-A22341106E2A (armv7) Myapp.app.dSYM/Contents/Resources/DWARF/Myapp
UUID: 1C481246-F6D4-3046-A80F-CAE800175402 (arm64) Myapp.app.dSYM/Contents/Resources/DWARF/Myapp
  1. 保证两处的uuid(相同架构)一致即可。

crash log符号化

进入工作目录,依次执行: export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer" ./symbolicatecrash crash.log Myapp.app.dSYM > log.txt log.txt即为符号化之后的log信息,便于查看。

解析指定地址

拿到crash log文件之后,很多时候我们只需要关心crash线程的调用栈,典型示例如下:

Thread 0 Crashed:
...
5   APP 0x104a06b30 0x1045c0000 + 4483888
6   APP 0x104a16d4c 0x1045c0000 + 4549964

这个时候可以用atos工具解析指定地址的符号:

atos -arch arm64 -o Myapp.app.dSYM/Contents/Resources/DWARF/Myapp -l 0x1045c0000 0x104a06b30

[扩展]Xcode Instruments: missing symbols

有时在使用Instruments分析时会出现missing symbols的情况,不利于分析泄露等问题。此时需要确保Debug Information Format开启了DWARF with dSYM File。还不行的话,就打开Instruments工具->File->Symbols,手动指定dSYM File,路径一般为~/Library/Developer/Xcode/DerivedData/xxxx/Build/Products/Debug-iphoneos/xxx.app.dSYM。

其它文章

iOS URLSession Authentication Challenge及SSL Pinning
iOS Method Swizzling使用陷阱
iOS crash log分析实践
Address Sanitizer的原理和使用
LLDB命令速查手册