大佬教程收集整理的这篇文章主要介绍了iOS底层 - 符号解析(dSYM & 系统符号)Go语言版本,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
由于业务发展需要,公司自建了APM系统,考虑到性能问题,需要在Linux服务器上解析dSYM及系统库符号,于是便写了一个Go版本的atos工具。
......
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)
}
}
......
详情请看源码
以上是大佬教程为你收集整理的iOS底层 - 符号解析(dSYM & 系统符号)Go语言版本全部内容,希望文章能够帮你解决iOS底层 - 符号解析(dSYM & 系统符号)Go语言版本所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。