已知对象A的内存地址查询哪些代码引用对象A的思路
1首先通过!dumpheap -type xxxx找到指定对象的地址
2 执行!gcroot 查看a的被哪些对象引用
3在内存中搜索A的地址,查看哪些内存是该A对象的指针 s-q 0 L?0xffffffffffffffff value 在0~oxffffffffffffffff 查询指定值 按8个字节
4 在内存中按照Byte的格式搜寻步骤2中所得的结果 s-b 0 L?0xffffffffffffffff value 在0~oxffffffffffffffff 查询指定值 按单字节
5可以将步骤3所得的结果与步骤1中的结果进行差值排查,原因:步骤2所得的都是一些引用了对象A的其他类型对象,而操作对象A时会将对象A的一个指针所在内存地址值存放于调用栈空间或者存在寄存器中,步骤3与步骤2的一些差值很有可能就是这些指针,这些临时指针的地址值会被硬编码在汇编代码中,所以步骤4可以找到这些硬编码所在的内存位置(汇编指令地址),最后执行!U xxxx就能找到对应的汇编代码
上述思路需windbg要一定的运气!!!!如果当前的dump抓得不好,对象的地址也有可能在某个时间被存放与寄存器中,但是抓取dump时寄存器的值被替换,那这种情况下,这种方式就没啥用。