- 找到这个task和对应的userspace call stack,一般userspace stack在恢复之前只有一行10个数字的用户层虚拟地址。
例如case 04941430 下面这个task com.miui.home.
- 找到这个task的 mm->pgd,并把它映射成物理地址。在T32 对话框中映射成物理地址: mmu.list.PageTable 0xFFFFFF8053866000, 物理地址是0xD3866000
- 点击 T32中的 Context-A53, 选择 memory management unit, 出现下面的对话框。
- 双击 TTBR0_EL1 左边的数字,把换算出来的 mm->pgd 的物理地址替换这个数字。 PER.Set.simple SPR:0x30200 %Quad 0xD3866000, 然后回车。
- 接着在T32的对话框命令行中输入mmu.off
- 然后输入mmu.scan,这个时间比较长,超个一个钟,等到它扫描完成
- 然后输入 mmu.on
- 右击这个task,选择Display detailed.
10. 在弹出的对话框中,展开code file,里面是这个task所有的加载的库或者执行文件的虚拟地址。
然后找这个task当前call stack 1中所在的 NUX:0x7D94634624(asm) 这个地址所对应的是哪一个库或者二进制文件。
找到这个lib,例如0x7D94634624 对应的库是libhwui.so,那么就找到这个库的地址是 0x7D94365000, 然后把这个库加载到这个地址就可以了。
如果 call stack 中因为
7.解析call stack的时候可能会出现下面的异常地址:
看一下此时的SP 是多少:
通过下面的命令修复
Data.Set NUD:0x7E102D0B88 %LE %Quad 0x7E23AD3EE0
同样的命令修复同样的问题:
Data.Set NUD:0x7E102D0BF8 %LE %Quad 0x7EA612F54C