RetroScope工具的下载、编译和启动,参考博客:
http://blog.csdn.net/rzwinters/article/details/77003230
1 根据源码分析RetroScope工具的使用方法
(1)运行emulator-MAGIC模拟器。
(2)开启另一个终端,执行命令:
$ adb logcat | grep -E "RetroScope|ZMB"
以监视RetroScope APP的日志信息。
启动RetroScope APP,根据日志信息搜索并阅读位于/dalvik/vm/zombie的RetroScope源代码,有如下发现:
(a)Zombie.h:
// someday we may receive these from somewhere
static const char mem_file_name[] = "/sdcard/mem.m";
static const char map_file_name[] = "/system/usr/data/map.m";
RetroScope工具的输入固定路径且固定文件名,mem文件命名为mem.m,map文件命名为map.m。
(b)MemMap.cpp,初始化函数:
void zmbMemMapInit(const char * map_file_name, const char * mem_file_name)
(c)MemMap.h,解析map文件每行内容的函数:
static inline MemSeg MemSegFromMapLine(char * map_line)
对比RetroScope工具源代码内包含的pmd工具源代码(/tools/pmd/jni/pmd.c),生成map文件的函数:
static inline void dump_mem(pid_t pid, int mem, int mem_file, FILE* maps, FILE* map_file,
pid_t**const tids, size_t*const n_tids, size_t*const max_tids)
MemSegFromMapLine函数中解析map文件的逻辑与dump_mem函数中生成map文件的逻辑相同,可以推断pmd工具生成的安卓手机指定进程的mem文件和map文件符合RetroScope工具的输入要求。
2 编译pmd工具
pmd工具的源代码位于RetroScope主目录下的tools/pmd目录中,使用Android NDK交叉编译该工具。
(1)配置环境变量,以方便使用ndk-build脚本编译源代码:
export NDK_PATH=/home/richard/and