LoliProfile Native内存分析工具
LoliProfiler是一款针对Android程序开发设计的轻量开源Native内存分析工具。以XCode Instrument Allocations为目标,实现即插即用的Profile体验。
通过PLT Hook内存分配和释放函数(malloc、calloc、realloc、memalign、free),来发现内存泄漏等问题。
LoliProfiler的日志文件与exe在同一目录,文件名为profiler.log。另外可使用logcat想得到更多日志信息。
02-21 15:55:54.571 24683 24683 I Loli : JNI_OnLoad 02-21 15:55:54.572 24683 24683 I Loli : mode: 2, build: framepointer, minRecSize: 0, blacklist: 0, hookLibs: libUE4,libgsdk,libitophttpdns,libturinggt,libtdmbeaconid,libCrashSight,libc++_shared,libhttpdns,libGVoice,libgrobot,libtersafe,libGPM,libHttpDnsPlugin,libMSDKCore,libtgpa,libTDataMaster,libCrashSightCore,libCrashSightPlugin,libAkReflect,libAkConvolutionReverb,libAkGuitarDistortion,libAkRoomVerb,libAkPeakLimiter,libAkDelay,libAkParametricEQ, 02-21 15:55:54.572 24683 24683 I Loli : loli start status 0 02-21 15:55:54.575 24683 25051 I Loli : libitophttpdns (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libitophttpdns.so) is loaded 02-21 15:55:54.575 24683 25051 I Loli : libUE4 (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so) is loaded 02-21 15:55:54.575 24683 25051 I Loli : libCrashSight (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libCrashSight.so) is loaded 02-21 15:55:54.576 24683 25051 I Loli : libc++_shared (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libc++_shared.so) is loaded 02-21 15:55:54.576 24683 25051 I Loli : libhttpdns (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libhttpdns.so) is loaded 02-21 15:55:54.576 24683 25051 I Loli : libGVoice (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libGVoice.so) is loaded 02-21 15:55:54.576 24683 25051 I Loli : libtersafe (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtersafe.so) is loaded 02-21 15:55:54.576 24683 25051 I Loli : libgrobot (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libgrobot.so) is loaded 02-21 15:55:54.576 24683 25051 I Loli : libGPM (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libGPM.so) is loaded 02-21 15:55:54.576 24683 25051 I Loli : libHttpDnsPlugin (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libHttpDnsPlugin.so) is loaded 02-21 15:55:54.576 24683 25051 I Loli : libMSDKCore (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libMSDKCore.so) is loaded 02-21 15:55:54.576 24683 25051 I Loli : libtgpa (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtgpa.so) is loaded 02-21 15:55:54.577 24683 25051 I Loli : libCrashSightCore (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libCrashSightCore.so) is loaded 02-21 15:55:54.577 24683 25051 I Loli : libCrashSight (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libCrashSightCore.so) is loaded 02-21 15:55:54.577 24683 25051 I Loli : libCrashSightPlugin (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libCrashSightPlugin.so) is loaded 02-21 15:55:54.577 24683 25051 I Loli : libCrashSight (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libCrashSightPlugin.so) is loaded 02-21 15:55:54.577 24683 25051 I Loli : libTDataMaster (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libTDataMaster.so) is loaded 02-21 15:55:54.577 24683 25051 I Loli : libturinggt (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libturinggt.so) is loaded 02-21 15:55:54.577 24683 25051 I Loli : libtdmbeaconid (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtdmbeaconid.so) is loaded 02-21 15:55:54.595 24683 25051 I Loli : loaded in Android at 0x70e6e000 02-21 15:55:54.595 24683 25051 E Loli : failed to open 02-21 15:55:54.595 24683 25051 I Loli : Error dlopen: 02-21 15:55:54.595 24683 25051 I Loli : loaded in Android at 0x70e6e000 02-21 15:55:54.595 24683 25051 E Loli : failed to open 02-21 15:55:54.595 24683 25051 I Loli : Error dlopen: 02-21 15:55:54.599 24683 25051 I Loli : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtdmbeaconid.so loaded in Android at 0x74c36c5000 02-21 15:55:54.599 24683 25051 I Loli : loaded in Android at 0x70e6e000 02-21 15:55:54.599 24683 25051 E Loli : failed to open 02-21 15:55:54.599 24683 25051 I Loli : Error dlopen: 02-21 15:55:54.599 24683 25051 I Loli : loaded in Android at 0x70e6e000 02-21 15:55:54.599 24683 25051 E Loli : failed to open 02-21 15:55:54.599 24683 25051 I Loli : Error dlopen: 02-21 15:55:54.601 24683 25051 I Loli : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so loaded in Android at 0x74afe80000 02-21 15:55:54.615 24683 25051 I Loli : loaded in Android at 0x70e6e000 02-21 15:55:54.615 24683 25051 E Loli : failed to open 02-21 15:55:54.615 24683 25051 I Loli : Error dlopen: 02-21 15:55:54.617 24683 25051 I Loli : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libCrashSightPlugin.so loaded in Android at 0x74c2d86000 02-21 15:55:54.619 24683 25051 I Loli : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libc++_shared.so loaded in Android at 0x74be6c2000 02-21 15:55:54.621 24683 25051 I Loli : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libCrashSightCore.so loaded in Android at 0x74c2640000 02-21 15:55:54.623 24683 25051 I Loli : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libTDataMaster.so loaded in Android at 0x74c2e02000 02-21 15:55:54.625 24683 25051 I Loli : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtgpa.so loaded in Android at 0x74c1440000 02-21 15:55:54.625 24683 25051 I Loli : loaded in Android at 0x70e6e000 02-21 15:55:54.625 24683 25051 E Loli : failed to open 02-21 15:55:54.625 24683 25051 I Loli : Error dlopen: 02-21 15:55:54.627 24683 25051 I Loli : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libHttpDnsPlugin.so loaded in Android at 0x74c09c5000 02-21 15:55:54.628 24683 25051 I Loli : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libGPM.so loaded in Android at 0x74c070c000 02-21 15:55:54.630 24683 25051 I Loli : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libGVoice.so loaded in Android at 0x74be840000 02-21 15:55:54.631 24683 25051 I Loli : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libMSDKCore.so loaded in Android at 0x74c0ac8000 02-21 15:55:54.632 24683 25051 I Loli : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libhttpdns.so loaded in Android at 0x74be7d1000 02-21 15:55:54.633 24683 25051 I Loli : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libitophttpdns.so loaded in Android at 0x6b6e062000 02-21 15:55:54.633 24683 25051 I Loli : loaded in Android at 0x70e6e000 02-21 15:55:54.633 24683 25051 E Loli : failed to open 02-21 15:55:54.633 24683 25051 I Loli : Error dlopen: 02-21 15:55:54.633 24683 25051 I Loli : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libCrashSight.so loaded in Android at 0x74be3cc000 02-21 15:55:54.634 24683 25051 I Loli : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtersafe.so loaded in Android at 0x74bff12000 02-21 15:55:54.635 24683 25051 I Loli : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libgrobot.so loaded in Android at 0x74c0698000 02-21 15:55:54.636 24683 25051 I Loli : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libturinggt.so loaded in Android at 0x74c3682000 02-21 15:55:54.636 24683 25051 I Loli : loaded in Android at 0x70e6e000 02-21 15:55:54.636 24683 25051 E Loli : failed to open 02-21 15:55:54.636 24683 25051 I Loli : Error dlopen: 02-21 15:55:54.636 24683 25051 I xhook : libxhook 1.1.12 (aarch64) 02-21 15:55:54.639 24683 25051 I xhook : init OK: /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libitophttpdns.so (RELA ELF_HASH PLT:2712 DYN:13080 ANDROID:0) 02-21 15:55:54.639 24683 25051 I xhook : hooking malloc in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libitophttpdns.so 02-21 15:55:54.639 24683 25051 I xhook : found malloc at symidx: 193 (ELF_HASH) 02-21 15:55:54.639 24683 25051 I xhook : found malloc at .rela.plt offset: 0x40d70 02-21 15:55:54.639 24683 25051 I xhook : XH_HK_OK 0x6b6e0a2d70: 0x75635b59ec -> 0x6b6cde6350 malloc /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libitophttpdns.so 02-21 15:55:54.639 24683 25051 I xhook : hooking free in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libitophttpdns.so 02-21 15:55:54.639 24683 25051 I xhook : found free at symidx: 213 (ELF_HASH) 02-21 15:55:54.639 24683 25051 I xhook : found free at .rela.plt offset: 0x40dd0 02-21 15:55:54.640 24683 25051 I xhook : XH_HK_OK 0x6b6e0a2dd0: 0x75635b59a4 -> 0x6b6cdcc558 free /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libitophttpdns.so 02-21 15:55:54.640 24683 25051 I xhook : hooking calloc in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libitophttpdns.so 02-21 15:55:54.640 24683 25051 I xhook : hooking memalign in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libitophttpdns.so 02-21 15:55:54.640 24683 25051 I xhook : hooking aligned_alloc in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libitophttpdns.so 02-21 15:55:54.640 24683 25051 I xhook : hooking posix_memalign in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libitophttpdns.so 02-21 15:55:54.640 24683 25051 I xhook : hooking realloc in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libitophttpdns.so 02-21 15:55:54.640 24683 25051 I xhook : found realloc at symidx: 19 (ELF_HASH) 02-21 15:55:54.640 24683 25051 I xhook : found realloc at .rela.plt offset: 0x40ab0 02-21 15:55:54.641 24683 25051 I xhook : XH_HK_OK 0x6b6e0a2ab0: 0x75635b5a64 -> 0x6b6cdea350 realloc /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libitophttpdns.so 02-21 15:55:54.641 24683 25051 I xhook : init OK: /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so (RELA GNU_HASH PLT:19656 DYN:32134656 ANDROID:0) 02-21 15:55:54.641 24683 25051 I xhook : hooking malloc in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so 02-21 15:55:54.641 24683 25051 I xhook : found malloc at symidx: 81 (GNU_HASH UNDEF) 02-21 15:55:54.641 24683 25051 I xhook : found malloc at .rela.plt offset: 0xded9060 02-21 15:55:54.642 24683 25051 I xhook : XH_HK_OK 0x74bdd59060: 0x75635b59ec -> 0x6b6cde62e8 malloc /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so 02-21 15:55:54.657 24683 25051 I xhook : found malloc at .rela.dyn offset: 0xded8910 02-21 15:55:54.658 24683 25051 I xhook : XH_HK_OK 0x74bdd58910: 0x75635b59ec -> 0x6b6cde62e8 malloc /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so 02-21 15:55:54.658 24683 25051 I xhook : found malloc at .rela.dyn offset: 0xdefe580 02-21 15:55:54.658 24683 25051 I xhook : XH_HK_OK 0x74bdd7e580: 0x75635b59ec -> 0x6b6cde62e8 malloc /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so 02-21 15:55:54.658 24683 25051 I xhook : found malloc at .rela.dyn offset: 0xdefe5a8 02-21 15:55:54.659 24683 25051 I xhook : XH_HK_OK 0x74bdd7e5a8: 0x75635b59ec -> 0x6b6cde62e8 malloc /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so 02-21 15:55:54.659 24683 25051 I xhook : found malloc at .rela.dyn offset: 0xdf02af0 02-21 15:55:54.659 24683 25051 I xhook : XH_HK_OK 0x74bdd82af0: 0x75635b59ec -> 0x6b6cde62e8 malloc /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so 02-21 15:55:54.660 24683 25051 I xhook : hooking free in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so 02-21 15:55:54.660 24683 25051 I xhook : found free at symidx: 80 (GNU_HASH UNDEF) 02-21 15:55:54.660 24683 25051 I xhook : found free at .rela.plt offset: 0xded9020 02-21 15:55:54.660 24683 25051 I xhook : XH_HK_OK 0x74bdd59020: 0x75635b59a4 -> 0x6b6cdcc558 free /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so 02-21 15:55:54.675 24683 25051 I xhook : found free at .rela.dyn offset: 0xded8920 02-21 15:55:54.676 24683 25051 I xhook : XH_HK_OK 0x74bdd58920: 0x75635b59a4 -> 0x6b6cdcc558 free /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so 02-21 15:55:54.676 24683 25051 I xhook : found free at .rela.dyn offset: 0xdefe5a0 02-21 15:55:54.677 24683 25051 I xhook : XH_HK_OK 0x74bdd7e5a0: 0x75635b59a4 -> 0x6b6cdcc558 free /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so 02-21 15:55:54.677 24683 25051 I xhook : found free at .rela.dyn offset: 0xdefe5b8 02-21 15:55:54.677 24683 25051 I xhook : XH_HK_OK 0x74bdd7e5b8: 0x75635b59a4 -> 0x6b6cdcc558 free /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so 02-21 15:55:54.677 24683 25051 I xhook : found free at .rela.dyn offset: 0xdf02af8 02-21 15:55:54.678 24683 25051 I xhook : XH_HK_OK 0x74bdd82af8: 0x75635b59a4 -> 0x6b6cdcc558 free /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so 02-21 15:55:54.678 24683 25051 I xhook : hooking calloc in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so 02-21 15:55:54.678 24683 25051 I xhook : found calloc at symidx: 265 (GNU_HASH UNDEF) 02-21 15:55:54.678 24683 25051 I xhook : found calloc at .rela.plt offset: 0xded9190 02-21 15:55:54.679 24683 25051 I xhook : XH_HK_OK 0x74bdd59190: 0x75635b598c -> 0x6b6cde72e8 calloc /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so 02-21 15:55:54.694 24683 25051 I xhook : found calloc at .rela.dyn offset: 0xded8950 02-21 15:55:54.695 24683 25051 I xhook : XH_HK_OK 0x74bdd58950: 0x75635b598c -> 0x6b6cde72e8 calloc /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so 02-21 15:55:54.695 24683 25051 I xhook : found calloc at .rela.dyn offset: 0xdf02b10 02-21 15:55:54.695 24683 25051 I xhook : XH_HK_OK 0x74bdd82b10: 0x75635b598c -> 0x6b6cde72e8 calloc /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so 02-21 15:55:54.695 24683 25051 I xhook : hooking memalign in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so 02-21 15:55:54.695 24683 25051 I xhook : hooking aligned_alloc in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so 02-21 15:55:54.695 24683 25051 I xhook : hooking posix_memalign in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so 02-21 15:55:54.695 24683 25051 I xhook : found posix_memalign at symidx: 473 (GNU_HASH UNDEF) 02-21 15:55:54.696 24683 25051 I xhook : found posix_memalign at .rela.plt offset: 0xded9b38 02-21 15:55:54.696 24683 25051 I xhook : XH_HK_OK 0x74bdd59b38: 0x75635b5a34 -> 0x6b6cde92e8 posix_memalign /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so 02-21 15:55:54.711 24683 25051 I xhook : hooking realloc in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so 02-21 15:55:54.711 24683 25051 I xhook : found realloc at symidx: 277 (GNU_HASH UNDEF) 02-21 15:55:54.711 24683 25051 I xhook : found realloc at .rela.plt offset: 0xded9600 02-21 15:55:54.712 24683 25051 I xhook : XH_HK_OK 0x74bdd59600: 0x75635b5a64 -> 0x6b6cdea2e8 realloc /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so 02-21 15:55:54.727 24683 25051 I xhook : found realloc at .rela.dyn offset: 0xded8930 02-21 15:55:54.728 24683 25051 I xhook : XH_HK_OK 0x74bdd58930: 0x75635b5a64 -> 0x6b6cdea2e8 realloc /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so 02-21 15:55:54.728 24683 25051 I xhook : found realloc at .rela.dyn offset: 0xdefe590 02-21 15:55:54.729 24683 25051 I xhook : XH_HK_OK 0x74bdd7e590: 0x75635b5a64 -> 0x6b6cdea2e8 realloc /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so 02-21 15:55:54.729 24683 25051 I xhook : found realloc at .rela.dyn offset: 0xdf02b00 02-21 15:55:54.729 24683 25051 I xhook : XH_HK_OK 0x74bdd82b00: 0x75635b5a64 -> 0x6b6cdea2e8 realloc /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so 。。。 。。。 02-21 15:55:54.815 24683 25051 I xhook : init OK: /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtdmbeaconid.so (RELA ELF_HASH PLT:816 DYN:1848 ANDROID:0) 02-21 15:55:54.815 24683 25051 I xhook : hooking malloc in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtdmbeaconid.so 02-21 15:55:54.815 24683 25051 I xhook : found malloc at symidx: 115 (ELF_HASH) 02-21 15:55:54.815 24683 25051 I xhook : found malloc at .rela.plt offset: 0x24d70 02-21 15:55:54.816 24683 25051 I xhook : XH_HK_OK 0x74c36e9d70: 0x75635b59ec -> 0x6b6cde62d0 malloc /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtdmbeaconid.so 02-21 15:55:54.816 24683 25051 I xhook : hooking free in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtdmbeaconid.so 02-21 15:55:54.816 24683 25051 I xhook : found free at symidx: 130 (ELF_HASH) 02-21 15:55:54.816 24683 25051 I xhook : found free at .rela.plt offset: 0x24da0 02-21 15:55:54.817 24683 25051 I xhook : XH_HK_OK 0x74c36e9da0: 0x75635b59a4 -> 0x6b6cdcc558 free /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtdmbeaconid.so 02-21 15:55:54.817 24683 25051 I xhook : hooking calloc in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtdmbeaconid.so 02-21 15:55:54.817 24683 25051 I xhook : hooking memalign in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtdmbeaconid.so 02-21 15:55:54.817 24683 25051 I xhook : hooking aligned_alloc in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtdmbeaconid.so 02-21 15:55:54.817 24683 25051 I xhook : hooking posix_memalign in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtdmbeaconid.so 02-21 15:55:54.817 24683 25051 I xhook : hooking realloc in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtdmbeaconid.so 02-21 15:55:54.826 24683 25051 I xhook : map refreshed
在Launch或Attach应用时,一定要kill掉当前机器上所有的adb进程(taskkill /f /im adb.exe),否则会导致Launch或Attach游戏时,一直卡住无法成功。
① Compiler包括llvm和gcc,因为技术限制LoliProfiler不支持同时调试gcc与clang 的动态库,只能二则选其一。注:如果同时 Hook了clang和gcc的动态库,程序可能会崩溃或卡死。
② Mode包括strict(抓取每一条符合阈值的记录)、loose(按统计学方法抓取部分符合阈值的记录)、nostack(不抓取堆栈信息)三种模式
③ Build包括三种:
(a) default -- 不需要修改编译参数,使用libunwind.so进行栈回溯,性能低下
(b) instrumented -- 带上-finstrument-functions、-finstrument-functions-after-inlining编译参数,会在所有函数进出时插入__cyg_profile_func_enter、__cyg_profile_func_exit函数
LoliProfiler会在这2个函数中记录堆栈调用。缺点是导致包体膨胀。
(c) framepointer -- 带上-fno-omit-frame-pointer编译参数,将FramePointer存储到一个通用寄存器中,结合__builtin_frame_address(0)来获得函数调用堆栈。
仅占用少量内存来存放各个栈帧的FramePointer及少量FramePointer的cpu运算,缺点非常小。UE4的Debug版本的apk包默认会开启-fno-omit-frame-pointer编译参数
④ Architecture(cpu架构),包括:armeabi-v7a、arm64-v8a和armeabi。
⑤ Threshold即阈值,当为0 byte时,表示会抓取所有记录;为8 bytes时,表示会抓取大于8字节的记录。注:阈值设得越小,抓取的记录越多,对游戏的性能影响也就越大。
⑥ Type分为white list(白名单)和black list(黑名单)。当使用gcc编译器时,建议把这些动态库加入到黑名单中,因为它们是用 clang 编译的:
libloli,libart,libc++,libc,libcutils,libart_base,libart_compiler
⑦ gles可尝试hook libGLESv2_adreno.so,vulkan可尝试hook vulkan.msm8998.so
LoliProfiler可以大致得到App的各个so的Native内存占用:
如图所示的设置就可以抓取整体的Native内存了。要点是将Mode改为nostack,通过记录这些信息得出内存是从哪个so申请来的。由于没有堆栈回溯,所以速度比较快,不太影响实际的游戏运行。
注:所有被hook的so需要都为同一类型,gcc或llvm。确定类型后,在面板的Compiler上设定为该类型。
对测试游戏,采用llvm,white list,列表为:
libUE4,libgsdk,libitophttpdns,libturinggt,libtdmbeaconid,libCrashSight,libc++_shared,libhttpdns,libGVoice,libgrobot,libtersafe,libGPM,libHttpDnsPlugin,libMSDKCore,libtgpa,libTDataMaster,libCrashSightCore,libCrashSightPlugin
libxgVipSecurity,libMcDSP,libMasteringSuite,libgcloud,libgcloudcore
vulkan.msm8998,eglSubDriverAndroid,libqdMetaData,gralloc.msm8998,libgrallocutils,libGLESv2_adreno,libGLESv1_CM_adreno,libEGL_adreno,libGLESv3,libGLESv2,libGLESv1_CM,libEGL,libunwind,libvulkan,libETC1,libsqlite
结果如下:
模块名 记录数 内存大小 All Libraries 201449 157 MB libtgpa.so 59 10.14 KB libTDataMaster.so 77 26.42 KB libgcloud.so 3496 2.59 MB libMSDKCore.so 81 10.63 KB libEGL_adreno.so 4 352 Bytes libCrashSightCore.so 6 388 Bytes libsqlite.so 772 682.20 KB eglSubDriverAndroid.so 12 864 Bytes libGLESv2_adreno.so 173064 145 MB // 显存相关 libgcloudcore.so 110 6.55 KB libUE4.so 19630 1.68 MB libCrashSightPlugin.so 12 83.87 KB libEGL.so 476 1.98 MB libGPM.so 1170 911.75 KB libGVoice.so 1336 2.36 MB libgrobot.so 1 8 Bytes libtersafe.so 1143 1.5 MB
UE4项目在Android和iOS平台缺省并没有使用Ansi(即:C标准库内存分配器),因此若想使用LoliProfiler工具跟踪Native内存,有两种方法:
方法①:将内存分配器修改为Ansi
方法②:集成LoliProfiler轻量API,在Binned、Binned2内存分配器的分配和释放函数中调用loli_alloc、loli_free来主动通知LoliProfiler记录 详见:GAME_ENGINE_CN.md
注:Binned、Binned2等内存分配器直接使用mmap、munmap向OS申请和释放虚拟内存,因此LoliProfiler无法直接跟踪到
注:Load Symbols加载debug so必须与运行时的so的名字。以上例来说,debug so的名字需为libUE4.so
注1:All Sizes为所有size的分配记录,Large为大size的分配记录,Medium为中等size的分配记录,Small为小size的分配记录。
注2:All Allocations为所有malloc过的记录,Persistent为malloc后还没有被free的记录。
注3:All Libraries为所有动态库。
注4:18800为记录数,1.38MB为内存总大小。
Copy to Clipboard
libUE4.so, AnsiRealloc(void*, unsigned long long, unsigned int) libUE4.so, FMallocAnsi::Realloc(void*, unsigned long long, unsigned int) libUE4.so, FMallocThreadSafeProxy::Realloc(void*, unsigned long long, unsigned int) libUE4.so, FMallocPoisonProxy::Realloc(void*, unsigned long long, unsigned int) libUE4.so, FMemory::Realloc(void*, unsigned long long, unsigned int) libUE4.so, TArray80, 8u> >, TSizedDefaultAllocator<32> >::ResizeGrow(int) libUE4.so, FSetElementId TSet , TDefaultMapHashableKeyFuncs false>, FDefaultSetAllocator>::Emplace const&, FTextLocalizationManager::FDisplayStringEntry&> >(TPairInitializer const&, FTextLocalizationManager::FDisplayStringEntry&>&&, bool*) libUE4.so, FTextLocalizationManager::GetDisplayString(FTextKey const&, FTextKey const&, FString const*) libUE4.so, FTextHistory_Base::SerializeForDisplayString(FStructuredArchiveRecord, TSharedPtr 1>&) libUE4.so, FText::SerializeText(FStructuredArchiveSlot, FText&) libUE4.so, FText::SerializeText(FArchive&, FText&) libUE4.so, FArchive::operator<<(FText&) libUE4.so, FPropertyTag::SerializeTaggedProperty(FStructuredArchiveSlot, FProperty*, unsigned char*, unsigned char*) const libUE4.so, UStruct::SerializeVersionedTaggedProperties(FStructuredArchiveSlot, unsigned char*, UStruct*, unsigned char*, UObject const*) const libUE4.so, UScriptStruct::SerializeItem(FStructuredArchiveSlot, void*, void const*) libUE4.so, UDataTable::LoadStructData(FStructuredArchiveSlot) libUE4.so, UDataTable::Serialize(FStructuredArchiveRecord) libUE4.so, UDataTable::Serialize(FArchive&) libUE4.so, FAsyncPackage::EventDrivenSerializeExport(int) libUE4.so, FAsyncPackage::ProcessImportsAndExports_Event() libUE4.so, FAsyncPackage::Event_ProcessImportsAndExports() libUE4.so, FAsyncLoadingThread::ProcessAsyncLoading(int&, bool, bool, float, FFlushTree*) libUE4.so, FAsyncLoadingThread::TickAsyncThread(bool, bool, float, bool&, FFlushTree*) libUE4.so, FAsyncLoadingThread::Run() libUE4.so, FRunnableThreadPThread::Run() libUE4.so, FRunnableThreadPThread::_ThreadProc(void*) libc.so, 0xe69d4 libc.so, 0x84b70
Copy with LineNumber
点击后,需要选择debug so所在目录,等待片刻后,就会使用ndk中的addr2line工具得到代码及LineNumber信息,并写入到剪切板中
libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/Core/Private/HAL/MallocAnsi.cpp:39 libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/Core/Private/HAL/MallocAnsi.cpp:195 libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/Core/Public\HAL/MallocThreadSafeProxy.h:52 libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/Core/Public\HAL/MallocPoisonProxy.h:66 libUE4.so, emutls.c:? libUE4.so, E:/UAGroup\UnrealEngine\Engine\Source\Runtime\Core\Public\Containers/ContainerAllocationPolicies.h:480 libUE4.so, E:/UAGroup\UnrealEngine\Engine\Source\Runtime\Core\Public\Containers/SparseArray.h:130 libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/Core/Public\Containers/Map.h:404 libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/Core/Public\Templates/SharedPointer.h:680 libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/Core/Private/Internationalization/Text.cpp:1010 libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/Core/Private/Internationalization/Text.cpp:802 libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/Core/Private/Serialization/Archive.cpp:450 libUE4.so, emutls.c:? libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/Core/Public\Serialization/Archive.h:304 libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/CoreUObject/Private/UObject/Class.cpp:2779 libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/Core/Public\Containers/Map.h:404 libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/Engine/Private/DataTable.cpp:252 libUE4.so, E:/UAGroup/R6Game/Intermediate/Build/Android/UAGame/Inc/Engine/DataTable.gen.cpp:552 libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/CoreUObject/Private/Serialization/AsyncLoading.cpp:3217 libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/CoreUObject/Private/Serialization/AsyncLoading.cpp:3542 libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/CoreUObject/Private/Serialization/AsyncLoading.cpp:2390 libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/Core/Public\Templates/Function.h:681 libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/CoreUObject/Private/Serialization/AsyncLoading.cpp:4882 libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/CoreUObject/Private/Serialization/AsyncLoading.cpp:4807 libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/Core/Private/HAL/PThreadRunnableThread.cpp:27 libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source\Runtime/Core/Private/HAL/PThreadRunnableThread.h:186 libc.so, 0xe69d4 libc.so, 0x84b70
按住Shift,然后在曲线图上拖动鼠标左键,可查看该选中范围的内存分配数据。
在 MacOS的触摸板上,用一个手指点击,另一个手指拖拽,即可选择时间区间。
TreeView模式
显示合并后的Callstacks
注:在底部输入框中,支持模糊搜索,可根据函数名称进行搜索
TreeMap模式
此模式比TreeView模式更直观,适合检查筛选问题最大的地方
点击“TreeView”,就是用TreeView的方式显示选择区域的起始线与终止线的内存分配diff差量
点击“TreeMap”,就是用TreeMap的方式显示选择区域的起始线与终止线的内存分配diff差量
在采集结束后,LoliProfiler会请求一次当前app的smaps数据。可通过菜单“Tools” -- “Stat proc/pid/smaps”弹出的面板来查看:
注:面板底部状态栏上,有VM(Virtual Memory)、Rss、Pss、PC(Private Clean)、PD(Private Dirty)、SC(Shared Clean)和SD(Shared Dirty)的统计信息。
查看hook到的malloc、calloc等创建的堆内存(All Sizes,Persistent,All Libraries)在smaps中的分布情况,即为近似的内存碎片查看功能。可通过菜单“Tools” -- “Vasualize proc/pid/smaps”弹出的面板来查看:
注1:smaps中共有21个[anon:libc_malloc]段
注2:共hook了1601578次malloc、calloc等创建的堆内存,size数之和为336.7MB
注3:1.34GB为21个[anon:libc_malloc]段的虚拟地址空间之和
注4:红色的部分是被malloc、calloc等分配出去的堆内存;绿色部分为未分配的
参考
QUICK_START_CN.md(如何使用)
GAME_ENGINE_CN.md(集成)
高效安卓非托管内存分析解决方案