由于业务发展需要,公司自建了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、按需提取高频次系统库
shell脚本提取系统库
解析系统符号......
for _, sym := range theFile.Symtab.Syms {
currentDistance = ...(略)...
if relativeAddress >= sym.Value && currentDistance <= bestDistance {
bestDistance = currentDistance
fmt.Println("Symbol: " + sym.Name)
}
}
......
详情请看源码
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)