前言
由于業務發展需要,公司自建了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)
}
}
......
詳情請看原始碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/397401.html
標籤:其他
上一篇:Android Binder,AIDL跨行程通訊詳解與實作,看一遍就懂
下一篇:安卓模擬器怎么切換IP地址

