iOS底层 - 符号解析(dSYM & 系统符号)Go语言版本
Posted HiccupTang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS底层 - 符号解析(dSYM & 系统符号)Go语言版本相关的知识,希望对你有一定的参考价值。
前言
由于业务发展需要,公司自建了APM系统,考虑到性能问题,需要在Linux服务器上解析dSYM及系统库符号,于是便写了一个Go版本的atos工具。
dSYM解析
......
func findLine(dwarfData *dwarf.Data, address uint64, entry *dwarf.Entry) (uint64,error)
var ErrUnknownLine = errors.New("ErrUnknownLine")
var lineNumber uint64
lineNumber = 0
var lineReader *dwarf.LineReader
var theErr error
if lineReader, theErr = dwarfData.LineReader(entry); theErr != nil
log.Printf("findLine lineReader error")
return 0,ErrUnknownLine
// findPC
var line2 dwarf.LineEntry
lineNumber, err := ...(略)...
if err != nil
log.Printf("lineReader findLine error")
return 0,ErrUnknownLine
return lineNumber,nil
......
详情请看源码
系统符号
提取符号
1.下载ipsw 文件
ipsw 固件下载地址: Firmware/iPhone
选择对应的版本包,例如
注意区分架构arm64/arm64e!!!(iPhoneXR之后的设备为arm64e架构)
2. 安装解析工具
安装解析命令工具 ipsw , 参考:Install - ipsw
|
3. 提取动态库缓存文件
动态库缓存文件名为 dyld_shared_cache_arm64 (或者 _arm64e 结尾)
|
执行后会在当前目录下生成一个包含缓存文件的文件夹,例如 18F72__iPhone13,2_3
4. 提取动态库
进入上一步生成的文件夹目录,创建存放动态库的目录,格式示例: 14.4.2_18D70 或者 14.4.2_18D70_arm64e
|
执行完成后,该文件夹包含系统符号文件,可用于符号解析。
5、按需提取高频次系统库
解析系统符号
......
for _, sym := range theFile.Symtab.Syms
currentDistance = ...(略)...
if relativeAddress >= sym.Value && currentDistance <= bestDistance
bestDistance = currentDistance
fmt.Println("Symbol: " + sym.Name)
......
详情请看源码
以上是关于iOS底层 - 符号解析(dSYM & 系统符号)Go语言版本的主要内容,如果未能解决你的问题,请参考以下文章
iOS 应用程序具有神秘的 UUID,没有匹配的 dSYM,因此无法符号化