Tencent / matrix

Matrix is a plugin style, non-invasive APM system developed by WeChat.
Other
11.61k stars 1.88k forks source link

请问有没有实际例子,根据offset符号化到代码行的例子。 #442

Open scorplot opened 4 years ago

scorplot commented 4 years ago

OOM的报告里出现了uuid和offset。使一堆数字,看起来他认识我,我不认识他。花了很多时间去研究,最后也没有符号化出来。 如果不能做到符号化,那么实际使用起来有什么意义?

chzhij5 commented 4 years ago

所以其实是能符号化的。

内存报告里面只有偏移地址(offset)。uuid 是二进制的标志,用来找对应的 dwarf 文件。

使用 atos 命令符号化,格式:

atos -o [dwarf文件地址] -arch arm64 -l [loadAddress] [instructionAddress]

instructionAddress - loadAddress = offset

atos 不接受 offset 地址。

所以假设 :

offset = 1000

可以强制设定 loadAddress = 1 (如果是0,会解不出), 那么 instructionAddress = loadAddress + offset。

instructionAddress = 1000 + 1 = 1001

那么最后的 atos 命令是:

0x3E9 ( 1001 的十六进制)

atos -o [dwarf文件地址] -arch arm64 -l 0x1 0x3E9

chzhij5 commented 4 years ago

可以是什么样子的,莫名其妙是什么样子的? 举个例子看看?

KorolZhu commented 3 years ago

所以问题的重点是怎么找到 loadAddress 呢,有知道的吗

liu3399shuai commented 3 years ago

所以问题的重点是怎么找到 loadAddress 呢,有知道的吗

同文,收集到的只有uuid和offset,没有loadAddress,那么就没有 instructionAddress(0x3E9),那咋用atos命令符号化出来呢

KorolZhu commented 3 years ago

loadAddress在app运行的时候可以通过代码读取的到的, matrix已经有工具类可以直接读取

let util = WCCrashReportInfoUtil.sharedInstance() as! WCCrashReportInfoUtil let images = util.getBinaryImages() ?? []

WallfacerMajor commented 3 years ago

loadAddress在app运行的时候可以通过代码读取的到的, matrix已经有工具类可以直接读取

let util = WCCrashReportInfoUtil.sharedInstance() as! WCCrashReportInfoUtil let images = util.getBinaryImages() ?? []

正解,可以自己修改代码将image_load信息写入上报信息中。然后自己写脚本拼装atos命令

gl-lei commented 1 year ago

offset 已经有了,loadAddress 可以直接写 __PAGEZERO 的大小,arm64 下是:0x100000000,非 arm64 下是:0x4000,也就是说,可以这样解析: atos -o [dwarf文件地址] -arch arm64 -l 0x100000000 0x100000000+offset