backtrace 为:
#00 pc 00000000026c0024 /data/dalvik-cache/arm64/system@framework@boot.oat (offset 0x26c0000)
#01 pc 00000000026e9d38 /data/dalvik-cache/arm64/system@framework@boot.oat (offset 0x26c0000)
当时oat 的map 为:
70cfb000-733bb000 r--p 00000000 fd:00 2909220 /data/dalvik-cache/arm64/system@framework@boot.oat
733bb000-75d9f000 r-xp 026c0000 fd:00 2909220 /data/dalvik-cache/arm64/system@framework@boot.oat
75d9f000-75da0000 rw-p 050a4000 fd:00 2909220 /data/dalvik-cache/arm64/system@framework@boot.oat
7f9d97e000-7f9d97f000 r--p 00000000 fd:00 2909220 /data/dalvik-cache/arm64/system@framework@boot.oat
04-25 16:20:10.868 10263 10263 W art : Failed to open oat file '/data/dalvik-cache/arm64/system@framework@boot.oat' referenced from image /data/dalvik-cache/arm64/system@framework@boot.art: Failed to ma
p ELF file segment 2 from /data/dalvik-cache/arm64/system@framework@boot.oat: mmap(0x733bb000, 43925504, 0x5, 0x12, 13, 40632320) of file '/data/dalvik-cache/arm64/system@framework@boot.oat' failed: Permiss
ion denied. See process maps in the log.
boot.oat 可执行代码的加载地址为:733bb000
相对于当时出问题的oat 文件,代码段的偏移地址为:0x26c0000
相对于当时出问题的oat 文件, 发生问题的代码在oat 中的偏移地址为:00000000026e9d38
编译或从对应手机中pull 出一个boot.oat 文件反编译:
此boot.oat文件,代码段的偏移地址为:
在boot.oat 的反编译文件中搜索:EXECUTABLE OFFSET 对应的地址 (0x026bf000)
正常与异常时 代码段的地址相见:
0x26c0000 - 0x026bf000 = 0x00001000
那么可知 发生异常时oat的代码段要比当前这个整体大 0x00001000
那么:
0x026c0024 - 0x00001000
0x026e9d38 - 0x00001000
即为backtrace,中地址转换到当前 oat 中的地址
如果 backtrace 给的是绝对地址,还需要减去733bb000,去计算