MemoryWatcher在win平台下是dll形式载入工程的,内嵌stackwalker,hook了win平台下常用的内存申请释放方法,对内存申请释放等进行记录。根据动态内存操作方式之间单一的层次关系(Windows平台下的内存管理),dll载入初始化的时候,对win平台下原有的内存申请方法进行了方法注入,调用内部实现的方法在进程堆上分配释放存储,完成了基本的申请释放跟踪。win平台下可以基于MemoryWatcher实现你所需要的功能,如果是linux平台,可能chrome的linux版也是有这个功能模块的,自行参考一下就好了。
最主要的几个类:MemoryWatcher,MemoryHook,CallStack(参考visualleakdetector,StackWalker)
MemoryWatcher 主要完成方法的hook,以及监测内存的分配与释放。
MemoryHook 主要完成模块内部使用的存储分配工作,内部使用的空间只能是在MemoryHook维护的堆空间上,否则会造成死循环,
同时MemoryHook完成MemoryWatcher的全局注册,内存的分配释放行为都会通知给注册的MemoryWatcher。
在dll入口方法,如下,监测者对象MemoryWatcher的创建,MemoryWatcher调用Hook方法完成内存相关操作的hook,同时完成CallStack初始化操作,将MemoryWatcher注册给MemoryHook以接收内存申请释放消息。入口方法中还创建了一个后台线程监测关键事件,注入heap句柄或指针无效等等,发生此类事情的时候可以生成转储记录日志等。
上面说过这里是通过hook内存申请释放方法辅助监测的,hook发生在MemoryHook::Hook()中,涵盖所有可能的申请释放行为:
举例INSTALL_PATCH的实现,记录来时的路,不然回不了家。
install过程稍微麻烦一些,感兴趣的话可以自己看一下,在preamble_patcher.cc
举例HeapAlloc与HeapFree的HeapFree"替代者",内部调用了MemoryHook的hook,后者调用了MemoryWatcher的hook,MemoryWatcher的hook中对存储进行跟踪记录。